क्या विश्व स्तर पर मावेन निर्भरता को बाहर करने का कोई तरीका है?


92

मैं एक "जेनेरिक" तरीका ढूंढने की कोशिश कर रहा हूं, जिसमें एक सकर्मक निर्भरता को शामिल किए बिना इसे शामिल करने के लिए सभी आश्रितों को इस पर निर्भर होने से बाहर रखा जा सकता है। उदाहरण के लिए, यदि मैं 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>

यह आंशिक रूप से पोम फ़ाइल को साफ करने के लिए है, आंशिक रूप से भविष्य में मुद्दों से बचने के लिए उन लोगों पर निर्भरता जोड़ने वाले लोगों के साथ जो उस बहिष्कृत निर्भरता पर निर्भर करते हैं - और इसे बाहर करने के लिए भूल जाते हैं।

क्या उधर रास्ता है?


2
समस्या को हल नहीं करता है, लेकिन maven-enforcer- प्लगइन में एक प्रतिबंधित निर्भरता विशेषता है जो कि निर्माण को विफल कर देगी यदि अवांछित निर्भरताएं अंदर घुस जाती हैं। आपको अभी भी मैन्युअल रूप से उन्हें बाहर करना होगा, हालांकि: - /
— dnault

एक वैकल्पिक उत्तर यहां उपलब्ध है: stackoverflow.com/a/39979760/363573
— Stephan

जवाबों:


69

क्या यह मदद करता है? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

"यह मानते हुए कि मैं अपने WAR से एवलॉन-फ्रेमवर्क को बाहर करना चाहता हूं, मैं अपनी परियोजनाओं पीओएम को निम्नलिखित के दायरे के साथ जोड़ दूंगा। यह सभी सकर्मक निर्भरताओं के पार काम करता है और आपको इसे एक बार निर्दिष्ट करने की अनुमति देता है।

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

यह तब भी काम करता है जब इसे मूल POM में निर्दिष्ट किया जाता है, जो परियोजनाओं को सभी बच्चे POMs में यह घोषित करने से रोक देगा। "


49
यह अभी भी केवल एक आंशिक हैक है - निर्भरता बिल्ड विरूपण साक्ष्य के अंदर समाप्त नहीं होगी लेकिन यह अभी भी परीक्षणों के दौरान उपलब्ध है।
— १on पर तुक्का मुस्टोंन

@TuukkaMustonen runtimeस्कोप की जगह providedस्कोप क्या है?
— स्टीफन

यदि परियोजना में कहीं और एवलॉन-फ्रेमवर्क 4.1.3+ शामिल है तो क्या होगा? यहाँ एक प्रतिक्रिया देखें: stackoverflow.com/a/39979760/363573
— Stephan

मैं अब मावेन का उपयोग नहीं करता हूं, इसलिए मैं अन्य उत्तरों की जांच करने की स्थिति में नहीं हूं, लेकिन मैं लोगों को इस बात पर विचार करने के लिए प्रोत्साहित करूंगा कि @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>

यह सही नहीं है क्योंकि अब से आपके संकलन / परीक्षण पथ में एक खाली जार है। लेकिन वह सिर्फ कॉस्मेटिक है।


3
systemस्कोप अब घटाया
— जेसन यंग

systemस्कोप का उपयोग करने से बचने के लिए, वर्चुअल मेवेन रिपॉजिटरी वर्जन 99.grons.nl (वार्निंग: HTTP केवल) या केवल (कॉमन्स-लॉगिंग / लॉग 4 जे के लिए
— सीन

16

Dnault की टिप्पणी पर विस्तार करने के लिए :

निर्भरता को बाहर करने के लिए व्यक्ति मावेन एनफोर्सर प्लगइन के प्रतिबंधित निर्भरता नियम का उपयोग कर सकता है। एक को अभी भी उन्हें मैन्युअल रूप से बाहर करना होगा, लेकिन यदि कोई अन्य व्यक्ति गलती से निर्भरता को जोड़ता है, तो बिल्ड विफल हो जाएगा।

<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>

इसके अलावा एक खुला सुविधा अनुरोध है: MNG-1977 वैश्विक निर्भरता बहिष्करण


2
आपके द्वारा दिए गए लिंक से आपके जवाब और पढ़ने की चर्चा के बाद मैंने महसूस किया कि अवांछित जार कुछ समय के लिए मोटे जार में आ रहे हैं क्योंकि स्थानीय और सर्वर पर उपयोग किए जाने वाले मावेन संस्करण अलग-अलग हैं इसलिए पैकेजिंग तर्क काफी हद तक निर्भरता नहीं होने पर निर्भरता के काफी भिन्न संस्करण जोड़ सकते हैं। अपनी इसी समस्या को हल करने के लिए मैंने <लक्ष्य> प्रतिकारक </ लक्ष्य> के लिए स्प्रिंग-बूट-मावेन-प्लगइन कॉन्फ़िगरेशन / बहिष्कृत / बहिष्कृत किया।
— धर्मनिरपेक्षता

10

एक अनुस्मारक के रूप में, यहाँ मावेन आधिकारिक दस्तावेज से उत्तर दिया गया है:

पीओएम स्तर के बजाय, प्रति-निर्भरता के आधार पर बहिष्करण क्यों किए जाते हैं

यह मुख्य रूप से यह सुनिश्चित करने के लिए किया जाता है कि निर्भरता ग्राफ अनुमानित है, और एक निर्भरता को बाहर करने से विरासत के प्रभाव को बनाए रखने के लिए जिसे बाहर नहीं किया जाना चाहिए। यदि आप अंतिम उपाय की विधि को प्राप्त करते हैं और एक बहिष्करण में डालते हैं, तो आपको पूरी तरह से निश्चित होना चाहिए कि आपकी कौन सी निर्भरता उस अवांछित परिवर्तनशील निर्भरता में ला रही है।

यदि कोई बिल्ड को अधिक मजबूत बनाना चाहता है, तो संस्करण रेंज का उपयोग किया जा सकता है। यह सुनिश्चित करेगा कि निर्भरता का कोई नया संस्करण परियोजना में हस्तक्षेप न कर सके।

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

किसी भी slf4j-api संस्करण> = 1.4.2 को रनटाइम के दौरान (प्रदान) के रूप में माना जाएगा, या तो एक कॉन्फ़िगर किए गए क्लासपैथ या कंटेनर से।

संदर्भ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.