বিশ্বব্যাপী কোনও ম্যাভেন নির্ভরতা বাদ দেওয়ার কোনও উপায় আছে কি?


93

আমি তার উপর নির্ভরশীল সমস্ত নির্ভরতা থেকে বাদ না দিয়ে ট্রানজিটিভ নির্ভরতা অন্তর্ভুক্ত করা থেকে একটি "জেনেরিক" উপায় অনুসন্ধান করার চেষ্টা করছি। উদাহরণস্বরূপ, আমি যদি slf4j বাদ দিতে চাই তবে আমি নিম্নলিখিতটি করি:

  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jmx</artifactId>
    <version>3.3.2.GA</version>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.4.0.GA</version>
    <type>jar</type>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>

আংশিকভাবে পম ফাইলটি পরিষ্কার করা, আংশিকভাবে ভবিষ্যতে সমস্যাগুলি এড়াতে লোকেরা সেই বর্জনিত নির্ভরতার উপর নির্ভরশীলতা যুক্ত করে - এবং এটি বাদ দিতে ভুলে যায়।

কোন উপায় আছে?


4
সমস্যাটি সমাধান করে না, তবে ম্যাভেন-এনফোর্সার-প্লাগইনটিতে একটি নিষিদ্ধ নির্ভরতা বৈশিষ্ট্য রয়েছে যা অবাঞ্ছিত নির্ভরতাগুলি
ঝুঁকিতে ফেললে বিল্ডটি

একটি বিকল্প উত্তর এখানে পাওয়া যায়: stackoverflow.com/a/39979760/363573
স্টিফান

উত্তর:


69

এটা কি সাহায্য করে? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

"ধরে নিচ্ছি যে আমি আমার ওয়ার থেকে অ্যাভালন-কাঠামোটি বাদ দিতে চাই, আমি সরবরাহের সুযোগ সহ আমার প্রকল্পগুলি পিওএম-এ নিম্নলিখিতগুলি যুক্ত করব This এটি সমস্ত ট্রানজিটিভ নির্ভরতা জুড়ে কাজ করে এবং আপনাকে একবার এটি নির্দিষ্ট করার অনুমতি দেয়।

<dependencies>
  <dependency>
      <artifactId>avalon-framework</artifactId>
      <groupId>avalon-framework</groupId>
      <version>4.1.3</version>
      <scope>provided</scope>
  </dependency>
</dependencies>

এমনকি এটি প্যারেন্ট পিওএম-তে নির্দিষ্ট করার সময়ও কাজ করে, যা প্রকল্পগুলিকে সমস্ত শিশু পিওএম-তে এটি ঘোষণা করা থেকে আটকাবে। "


49
এটি এখনও কেবল একটি আংশিক হ্যাক - নির্ভরতা বিল্ড আর্টিক্যাক্টের অভ্যন্তরে শেষ হবে না তবে এটি পরীক্ষার সময় পাওয়া যায়।
টুউকা মুস্তোনেন

@ TuukkaMustonen runtimeসুযোগের বদলে providedসুযোগ কী?
স্টিফান

যদি এভালন-কাঠামো ৪.১.৩+ প্রকল্পের অন্য কোথাও অন্তর্ভুক্ত করা হয় তবে কী হবে? এখানে একটি প্রতিক্রিয়া দেখুন: stackoverflow.com/a/39979760/363573
স্টিফান

আমি ম্যাভেন আর ব্যবহার করছেন না তাই আমি একটি অবস্থান অন্য উত্তর পরীক্ষা করার নেই, কিন্তু আমি ভাবেন যে এক একটি আংশিক হ্যাক নয় @TuukkaMustonen অনুযায়ী আছে, ক্ষেত্রে তাদের বিবেচনা করতে উত্সাহিত চাই
Joffer

18

আমি একটি খালি জার তৈরি করেছি এবং এই নির্ভরতা তৈরি করেছি:

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <scope>system</scope>
    <systemPath>${basedir}/src/lib/empty.jar</systemPath>
    <version>0</version>
</dependency>

এটি নিখুঁত নয় কারণ এখন থেকে আপনার সংকলন / পরীক্ষার পথে খালি জার রয়েছে। তবে এটি কেবল প্রসাধনী।


4
systemসুযোগটি এখন অবচয় করা
জেসন ইয়ং

systemস্কোপ ব্যবহার এড়াতে , ভার্চুয়াল মাভেন সংগ্রহস্থল সংস্করণ 99.grons.nl দেখুন (কেবল সতর্কতা: কেবল এইচটিটিপি) বা (কেবলমাত্র কমন্স-লগিং / লগ 4 জনের জন্য
seanf

16

ড্যানাল্টের মন্তব্যে প্রসারিত করতে :

নির্ভরতা বাদ দেওয়া হয়েছে তা নিশ্চিত করতে কেউ ম্যাভেন এনফোসর প্লাগইনের নিষিদ্ধ নির্ভরতা নিয়ম ব্যবহার করতে পারেন । এখনও একটি এটিকে ম্যানুয়ালি বাদ দিতে হবে, তবে কেউ ভুল করে অন্য কোথাও নির্ভরতা যুক্ত করলে বিল্ডটি ব্যর্থ হবে।

<dependencies>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jmx</artifactId>
    <version>3.3.2.GA</version>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
</dependencies>

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.4.1</version>
    <executions>
      <execution>
        <goals>
          <goal>enforce</goal>
        </goals>
        <configuration>
          <rules>
            <bannedDependencies>
              <excludes>
                <exclude>org.slf4j:slf4j-api</exclude>
              </excludes>
            </bannedDependencies>
          </rules>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>

এছাড়াও একটি ওপেন বৈশিষ্ট্য অনুরোধ রয়েছে: এমএনজি-1977 গ্লোবাল নির্ভরতা বহির্ভূত


4
আপনার প্রদত্ত লিঙ্কটি থেকে উত্তর এবং পাঠের আলোচনার পরে আপনি বুঝতে পেরেছেন যে অবাঞ্ছিত জারগুলি বেশিরভাগ সময় চর্বিযুক্ত জারে আসে কারণ স্থানীয় এবং সার্ভারে ব্যবহৃত মভেন সংস্করণটি আলাদা তাই প্যাকেজিং লজিক নির্ভরতাগুলির ভিন্ন ভিন্ন সংস্করণ যুক্ত করতে পারে যদি সেগুলি কঠোরভাবে প্রয়োগ করা হয় না। আমার অনুরূপ সমস্যা সমাধানের জন্য আমি <goal> repackage </goal> এর জন্য বসন্ত-বুট-মাভেন-প্লাগইন কনফিগারেশন / বাদ / বাদ দিয়েছি।
এপ্রোডান

10

অনুস্মারক হিসাবে, এখানে মাভেন অফিসিয়াল ডকুমেন্টেশনের উত্তর:

পিএমএম স্তরের পরিবর্তে প্রতি নির্ভরশীলতার ভিত্তিতে ব্যতিক্রম কেন করা হয়

নির্ভরতা গ্রাফটি পূর্বাভাসযোগ্য কিনা তা নিশ্চিত করার জন্য এবং উত্তরাধিকারের প্রভাবগুলিকে নির্ভরযোগ্যতা বাদ দেওয়া থেকে বাদ দেওয়া উচিত নয় যা এটি করা হয় This আপনি যদি সর্বশেষ অবলম্বনের পদ্ধতিটিতে পৌঁছে যান এবং কোনও বর্জন করতে হয় তবে আপনার কোন নির্ভরতা সেই অনাকাঙ্ক্ষিত ট্রানজিটিভ নির্ভরতা আনছে তা আপনি অবশ্যই নিশ্চিত হন।

যদি কেউ একটি বিল্ডকে আরও দৃust় করতে চায় তবে একটি সংস্করণ পরিসর ব্যবহার করা যেতে পারে। এটি নিশ্চিত করবে যে নির্ভরতার কোনও নতুন সংস্করণ প্রকল্পে হস্তক্ষেপ করতে পারে না।

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>[1.4.2,)</version>
   <scope>provided</scope>
</dependency>

যে কোনও slf4j-api সংস্করণ> = 1.4.2 রানটাইমের সময় প্রস্তাবিত (সরবরাহিত) হিসাবে বিবেচিত হবে, তা কোনও কনফিগার করা ক্লাসপাথ বা কোনও ধারক থেকে।

তথ্যসূত্র

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.