एकल निर्भरता की सभी सकर्मक निर्भरता को छोड़ दें


221

Maven2 में, एक एकल संक्रामक निर्भरता को बाहर करने के लिए, मुझे ऐसा कुछ करना होगा:

<dependency>
  <groupId>sample.group</groupId>
  <artifactId>sample-artifactB</artifactId>
  <version>1</version>
   <exclusions>
     <exclusion>
       <groupId>sample.group</groupId>
       <artifactId>sample-artifactAB</artifactId>
     </exclusion>
   </exclusions>
</dependency>

इस दृष्टिकोण के साथ समस्या यह है कि मुझे इसके द्वारा योगदान की गई प्रत्येक सकरात्मक निर्भरता के लिए करना है sample-artifactB

क्या एक-के-एक-एक के बजाय एक ही समय में सभी प्रकार की निर्भरता को बाहर करने के लिए कुछ प्रकार के वाइल्डकार्ड का उपयोग करने का एक तरीका है?


कई बार लाइब्रेरी के लेटेस्ट वर्जन को स्प्रिंग 2.5.6 कहने की जरूरत होती है, लेकिन कुछ अन्य डिपेंडेंसी में पुराने वर्जन शामिल होते हैं जैसे स्ट्रट्स 2-स्प्रिंग-प्लगइन (2.1.6) में स्प्रिंग 2.5.3 शामिल है। ऐसे परिदृश्यों में संस्करण को शामिल करने या ओवरराइड करने की आवश्यकता होती है।
विनोद सिंह

1
आइवी का उपयोग करें। मजाक कर रहा हूं।
जेक टोरंटो

जवाबों:


54

Maven2 के लिए ऐसा कोई तरीका नहीं है जो आप वर्णन करें। मावेन 3 के लिए, वहाँ है। यदि आप मावेन 3 का उपयोग कर रहे हैं, तो कृपया इस प्रश्न का एक और उत्तर देखें

मावेन 2 के लिए मैं आपके <बहिष्करण> पर निर्भरता के लिए अपना स्वयं का कस्टम पोम बनाने की सलाह दूंगा। उन परियोजनाओं के लिए जिन्हें उस निर्भरता का उपयोग करने की आवश्यकता होती है, सामान्य कलाकृतियों के बजाय अपने कस्टम पोम पर निर्भरता निर्धारित करें। जबकि यह जरूरी नहीं है कि आप एक एकल <बहिष्करण> के साथ सभी सकर्मक निर्भरता को बाहर कर दें, यह आपको केवल एक बार अपनी निर्भरता लिखने की अनुमति देता है और आपकी सभी परियोजनाओं को अनावश्यक और लंबी बहिष्करण सूची बनाए रखने की आवश्यकता नहीं है।


12
मैं बहिष्करण के आसपास काम करने के लिए अपनी खुद की पोम बनाने के खिलाफ सिफारिश करूंगा। यह आपके बिल्ड को कम पोर्टेबल बनाता है और समझ को कम करता है।
ब्रायन फॉक्स

1
मामले में आप अतीत को स्वीकार नहीं करते हैं: jira.codehaus.org/browse/MNG-3832
Jakub Bochenski

@JakubBochenski ने जो उत्तर दिया है वह मावेन 2 के लिए विशिष्ट है, जो कि इस प्रश्न के साथ टैग किया गया है (जिस समय मैंने यह टिप्पणी लिखी थी)। आपका लिंक केवल maven 3 के लिए प्रासंगिक है। इसके बावजूद, मैंने अपने उत्तर को अधिक उच्च उत्कीर्ण उत्तर से लिंक करने के लिए संपादित किया है।
व्हेल

306

मेरे लिए क्या काम किया है (मावेन की एक नई विशेषता हो सकती है) केवल बहिष्करण तत्व में वाइल्डकार्ड कर रहा है।

मेरे पास एक मल्टी-मॉड्यूल प्रोजेक्ट है जिसमें एक "ऐप" मॉड्यूल है जो दो WAR-पैकेज्ड मॉड्यूल में संदर्भित है। उन WAR- पैकेज्ड मॉड्यूल में से एक को वास्तव में केवल डोमेन वर्गों की आवश्यकता होती है (और मैंने उन्हें अभी तक ऐप मॉड्यूल से अलग नहीं किया है)। मुझे यह काम करने के लिए मिला:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>app</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

GroupId और विरूपण साक्ष्य दोनों पर वाइल्डकार्ड उन सभी निर्भरताओं को बाहर करता है जो सामान्य रूप से इस निर्भरता का उपयोग करके मॉड्यूल के माध्यम से प्रचारित करेंगे।


9
समूह और आर्टिफ़िएक्ट के लिए * वाइल्डकार्ड मावेन 3 में काम कर रहा है
nkr1pt

22
मुझे नहीं पता कि आप इस काम को कैसे पा सकते हैं, क्योंकि मावेन 3 स्पष्ट रूप से तारांकन के उपयोग के बारे में चेतावनी देता है: [कला] निर्भरता। पर निर्भरता .exclusions.exclusion.groupId <<artifcat_id> के साथ "" "" नहीं करता है एक मान्य आईडी पैटर्न से मेल खाते हैं। [चेतावनी] इन समस्याओं को ठीक करने के लिए अत्यधिक अनुशंसा की जाती है क्योंकि वे आपके निर्माण की स्थिरता को खतरा देते हैं। [चेतावनी] इस कारण से, भविष्य के मावेन संस्करण अब इस तरह की विकृत परियोजनाओं के निर्माण का समर्थन नहीं कर सकते हैं। क्या आप कुछ सबूत देना चाहेंगे कि यह समर्थित है और इसका उपयोग किया जा सकता है? अन्यथा मैं आपकी टिप्पणी को बेहद भ्रामक मानूंगा।
ᄂ ᄂ

7
मावेन 3.0.4 के साथ खूबसूरती से काम किया। बहुत बहुत धन्यवाद !
एवगेनी गोल्डिन

1
मावेन 3.0.4 -> इसने मेरे लिए अच्छा काम नहीं किया। जब मैं तारांकन का उपयोग करता हूं, या जब मैं स्पष्ट रूप से सभी प्रत्यक्ष निर्भरताओं को बाहर करता हूं, तो परिणामित जार बहुत अधिक भिन्न होता है। यह फैट जार बनाने के लिए मावेन-असेंबली-प्लगइन का उपयोग करके तथ्य के साथ करना होगा। इस मामले में, सुझाई गई व्यर्थता काम नहीं करती है!
गिल्ड होच

31
यह विधि मान्य है। उन्होंने चेतावनी दी कि अन्य लोग मावेन
रयान

32

एक चीज जो मुझे उपयोगी लगी है:

यदि आप अपनी परियोजना के लिए या तो माता-पिता POM के निर्भरता प्रबंधन अनुभाग में बहिष्करणों के साथ निर्भरता रखते हैं, या किसी आयात योग्य निर्भरता प्रबंधन POM में, तो आपको बहिष्करण (या संस्करण) को दोहराने की आवश्यकता नहीं है।

उदाहरण के लिए, यदि आपके माता-पिता के पास पोम है:

<dependencyManagement>
    <dependencies>
    ...         
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.1</version>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
     ....
  </dependencies>
</dependencyManagement>

तब आपकी परियोजना में मॉड्यूल केवल निर्भरता की घोषणा कर सकते हैं:

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>

मूल POM में संस्करण और बहिष्करण दोनों निर्दिष्ट होंगे। मैं हमारी लगभग सभी परियोजनाओं के लिए इस तकनीक का उपयोग करता हूं और यह बहुत अधिक पुनरावृत्ति को समाप्त करता है।


23

तीन साल पहले मैंने संस्करण 99 का उपयोग नहीं करने की सिफारिश की थी , लेकिन अब मैंने एक बेहतर तरीका खोज लिया है, खासकर जब से संस्करण 99 ऑफ़लाइन है:

अपने प्रोजेक्ट के मूल POM में, बिल्ड को विफल करने के लिए maven-enforcer- प्लगइन का उपयोग करें यदि निर्माण में अवांछित निर्भरता रेंगती है। यह प्लगइन के प्रतिबंधित निर्भरता नियम का उपयोग करके किया जा सकता है :

<plugin>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.0.1</version>
    <executions>
        <execution>
            <id>only-junit-dep-is-used</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <bannedDependencies>
                        <excludes>
                            <exclude>junit:junit</exclude>
                        </excludes>
                    </bannedDependencies>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

फिर जब वह आपको एक अवांछित निर्भरता के बारे में सचेत करता है, तो उसे मूल POM के <dependencyManagement>अनुभाग में बाहर करें :

<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-test</artifactId>
    <version>2.1.8.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

इस तरह अनचाहे निर्भरता गलती से दिखाई नहीं देगी (केवल एक व्यक्ति <exclusion>को भूलना आसान है), यह संकलन समय ( providedगुंजाइश के विपरीत ) के दौरान भी उपलब्ध नहीं होगा , कोई फर्जी निर्भरता नहीं हैं (संस्करण 99 के विपरीत) और यह ' कस्टम रिपॉजिटरी के बिना काम करेंगे (संस्करण 99 के विपरीत)। यह दृष्टिकोण विरूपण साक्ष्य के संस्करण, क्लासिफायर, स्कोप या पूरे समूहीकरण के आधार पर भी काम करेगा - विवरण के लिए प्रलेखन देखें।


ध्यान दें कि कम से कम मावेन 3.1 के तहत, <configuration>कमांड-लाइन से लक्ष्य को निष्पादित करते समय अनदेखा किया जाता है और इसे सीधे नीचे ले जाना चाहिए <plugin>
डेविड हार्कस

मैंने अभी-अभी पाया कि एक गंदा मावेन बग जैसा दिखता है - संस्करण 3.5.2। मेरे पास सबमॉडल्स के साथ एक परियोजना है, जहां मैं माता-पिता के <dependencyManagement>अनुभाग पर निर्भरता को बाहर करता हूं । mvn dependency:treeउस विशिष्ट परियोजना में चलने से बाहर की निर्भरता बिल्कुल नहीं होगी। लेकिन उस निर्भरता को आयात करने वाली सभी परियोजनाएं <exclusions>अन्य प्रोजेक्ट पैरेंट पोम से सम्मान नहीं लेंगी - अपवर्जित एक में रेंगना होगा !!! मुझे <exclusions>सीधे प्रत्येक मॉड्यूल पोम में जाना था ।
cbaldan

11

मैं निम्नलिखित वर्कअराउंड का उपयोग करता हूं: सभी उपयुक्त निर्भरताओं में विरूपण साक्ष्य को बाहर करने की कोशिश करने के बजाय, मैं शीर्ष स्तर पर "प्रदान" के रूप में निर्भरता आकर्षित करता हूं। उदाहरण के लिए, शिपिंग से बचने के लिए xml-apis "जो भी संस्करण":

    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>[1.0,]</version>
        <scope>provided</scope>
    </dependency>

9

वर्तमान में, एक समय में एक से अधिक सकरात्मक निर्भरता को बाहर करने का कोई तरीका नहीं है, लेकिन मावेन जिरा साइट पर इसके लिए एक सुविधा अनुरोध है:

https://issues.apache.org/jira/browse/MNG-2315


6

इसके लिए एक वर्कअराउंड है, यदि आप रनटाइम के लिए एक निर्भरता का दायरा निर्धारित करते हैं, तो सकर्मक निर्भरता को बाहर रखा जाएगा। हालांकि इस बात से अवगत रहें कि यदि आप रनटाइम निर्भरता को पैकेज करना चाहते हैं तो आपको अतिरिक्त प्रसंस्करण में जोड़ना होगा।

किसी भी पैकेजिंग में रनटाइम निर्भरता को शामिल करने के लिए, आप एक विशिष्ट विरूपण साक्ष्य के लिए मावेन-निर्भरता-प्लगइन के प्रतिलिपि लक्ष्य का उपयोग कर सकते हैं ।


1
इससे मुझे एंड्रॉइड डाल्विक कंपाइलर के साथ मुद्दों पर काम करने में मदद मिली, जो दो-स्तरीय सकर्मक समावेशों में से कुछ को संभाल नहीं सका --- लेकिन मुझे <scope>provided</scope>इसके बजाय उपयोग करना पड़ा <scope>runtime</scope>
गैरेट विल्सन

6

यदि आपको एक विधानसभा में शामिल करने जा रहे एक निर्भरता विरूपण साक्ष्य से सभी सकर्मक निर्भरता को बाहर करने की आवश्यकता है, तो आप इसे विधानसभा-प्लगइन के लिए विवरणक में निर्दिष्ट कर सकते हैं:

<assembly>
    <id>myApp</id>
    <formats>
        <format>zip</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <useTransitiveDependencies>false</useTransitiveDependencies>
            <includes><include>*:struts2-spring-plugin:jar:2.1.6</include></includes>
        </dependencySet>
    </dependencySets>
</assembly>

3

यदि आप ग्रहण के तहत विकसित होते हैं, तो आप पोम संपादक (उन्नत टैब सक्षम) पर निर्भरता ग्राफ को उस निर्भरता के लिए देख सकते हैं जिसे आप अपनी परियोजना से बाहर करना चाहते हैं और फिर:

उस पर राइट क्लिक करें -> "एक्वल्यू मावेन आर्टिफ़िकेशन ..." और एक्लिप्स आपके लिए अपवर्जन बना देगा बिना यह पता लगाए कि किस पर निर्भरता लिब से जुड़ी है।


ध्यान दें कि यह केवल तभी काम करता है जब आप m2eclipse प्लगइन का उपयोग कर रहे हैं
निकोलस मोमाएर्ट्स

2

सभी सकर्मक निर्भरताओं को छोड़कर आपके कारण क्या है?

यदि कोई विशेष विरूपण साक्ष्य (जैसे कॉमन-लॉगिंग) है, जिसे आपको हर निर्भरता से बाहर करने की आवश्यकता है, तो संस्करण 99 क्या मौजूद नहीं है दृष्टिकोण मदद कर सकता है।


अपडेट 2012: इस दृष्टिकोण का उपयोग न करें। Maven-enforcer- प्लगइन और बहिष्करण का उपयोग करें । संस्करण 99 फर्जी निर्भरता पैदा करता है और संस्करण 99 रिपॉजिटरी ऑफ़लाइन है ( समान दर्पण हैं लेकिन आप उन पर हमेशा के लिए ऑनलाइन रहने के लिए भरोसा नहीं कर सकते हैं; यह केवल मावेन सेंट्रल का उपयोग करना सबसे अच्छा है)।


1

एक simular मुद्दे में मुझे वांछित आश्रितता प्रदान की गई गुंजाइश के साथ घोषित किया गया था। इस दृष्टिकोण के साथ सकर्मक निर्भरताएं प्राप्त होती हैं, लेकिन पैकेज चरण में शामिल नहीं हैं, जो आप चाहते हैं। मैं रखरखाव के मामले में भी इस समाधान को पसंद करता हूं, क्योंकि व्हेल के समाधान में कोई पोम, या कस्टम पोम नहीं है, जिसे बनाए रखने की आवश्यकता है; आपको केवल कंटेनर में विशिष्ट निर्भरता प्रदान करने की आवश्यकता है और किया जाना चाहिए


-2

अपनी कक्षा में नवीनतम मावेन का उपयोग करें .. यह नकली कलाकृतियों को हटा देगा और नवीनतम मावेन कलाकृतियों को रखेगा।

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