मावेन: एक पुस्तकालय द्वारा जोड़े गए निर्भरता को कैसे ओवरराइड करना है


116

यहाँ मेरी सामान्य समस्या है:

मेरा प्रोजेक्ट P A पर निर्भर करता है जो B पर निर्भर करता है जो C पर निर्भर करता है जो D के संस्करण 1.0.1 पर निर्भर करता है।

D के संस्करण 1.0.1 के साथ एक समस्या है और मैं दूसरे मॉड्यूल के उपयोग को बाध्य करना चाहता हूं। मुझे नहीं पता कि मैं अपने प्रोजेक्ट के POMs में इसे कैसे घोषित करूं क्योंकि मैंने सीधे D पर निर्भरता नहीं जोड़ी है। यह C है जो D पर निर्भरता घोषित करता है।

महत्वपूर्ण: इस मामले में, न केवल संस्करण बदल जाता है, बल्कि समूह और कलाकृति भी। तो यह सिर्फ निर्भरता के संस्करण को ओवरराइड करने की बात नहीं है, बल्कि एक मॉड्यूल को छोड़कर और एक अन्य को शामिल करने के लिए है।

ठोस मामले में, D StAX है, जिसका 1.0.1 बग है । बग में नोटों के अनुसार, "समस्याओं को हल किया गया था- stax-api-1.0.1 (maven GroupId = stax) को stax-api-1.0-2 (maven GroupId = javax.xml.stream) द्वारा" इसलिए " मैं बस कोशिश कर रहा हूँ।

इस प्रकार, D = stax: stax-api: jar: 1.0.1 और C = org.apache.xmlbeans: xmlbeans: jar: 2.3.0

मैं maven का उपयोग कर रहा हूँ 2.0.9 अगर यह मायने रखता है।

Mvan निर्भरता का उत्पादन: पेड़ "

mvn dependency:tree
[..snip..]
[INFO] +- org.apache.poi:poi-ooxml:jar:3.6:compile
[INFO] |  +- org.apache.poi:poi-ooxml-schemas:jar:3.6:compile
[INFO] |  |  +- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile
[INFO] |  |  |  \- stax:stax-api:jar:1.0.1:compile

मेरी परियोजना के पोम में "ए" पर निम्न निर्भरता है:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.6</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.6</version>
</dependency>

अग्रिम में धन्यवाद।

जवाबों:


100

बस अपने वर्तमान pom में संस्करण निर्दिष्ट करें। यहां निर्दिष्ट संस्करण अन्य को ओवरराइड करेगा।

एक संस्करण को मजबूर करना
एक संस्करण को हमेशा सम्मानित किया जाएगा यदि यह वर्तमान पीओएम में एक विशेष संस्करण के साथ घोषित किया जाता है - हालांकि, यह ध्यान दिया जाना चाहिए कि यह अन्य पॉम डाउनस्ट्रीम को भी प्रभावित करेगा यदि यह स्वयं परजीवी निर्भरता का उपयोग करने पर निर्भर है।


संसाधन:


5
यह स्पष्ट नहीं है कि मैं संस्करण को कैसे निर्दिष्ट कर सकता हूं क्योंकि मैं डी पर निर्भरता की घोषणा नहीं करता हूं। इसके अलावा, आपके द्वारा प्रदान किया गया पहला लिंक "यह दस्तावेज़ निर्भरता प्रबंधन के लिए बाकी आवश्यकताओं का वर्णन करता है जो अभी तक मावेन 2.0 के लिए लागू नहीं किए गए हैं, विशेष रूप से सकर्मक निर्भरता के संबंध में। " शीर्ष पर।
इच्छा

@wishihadabettername, जैसा कि अन्य दस्तावेज़ में कहा गया है: "आप स्पष्ट रूप से डी 2.0 के उपयोग को मजबूर करने के लिए ए में डी 2.0 पर निर्भरता जोड़ सकते हैं"
कॉलिन हेबर्ट

1
आप वास्तव में अपने स्वयं के पोम में बहुत ही <निर्भरता> प्रविष्टि की नकल करते हैं। अपनी निर्भरता में, एक <संस्करण> निर्दिष्ट करें जो आप चाहते हैं। यह "गहन" निर्भरता द्वारा उपयोग किए गए किसी भी संस्करण को ओवरराइड करेगा।
कीथ टायलर

27

वैकल्पिक रूप से, आप केवल उस निर्भरता को बाहर कर सकते हैं जो आप नहीं चाहते हैं। STAX JDK 1.6 में शामिल है, इसलिए यदि आप 1.6 का उपयोग कर रहे हैं तो आप इसे पूरी तरह से बाहर कर सकते हैं।

नीचे मेरा उदाहरण आपके लिए थोड़ा गलत है - आपको केवल दो बहिष्करणों में से एक की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि कौन सा है। Stax के अन्य संस्करण हैं, जिनके बारे में मेरे उदाहरण में, नीचे मैं A आयात कर रहा था जो कि B & C आयात कर रहा था, जो C & D को आयात कर रहा था, जिसमें से प्रत्येक (अभी तक अधिक सकरात्मक निर्भरता के माध्यम से) Stax के विभिन्न संस्करणों को आयात किया था। इसलिए 'ए' पर मेरी निर्भरता में, मैंने स्टैक्स के दोनों संस्करणों को बाहर कर दिया।

<dependency>
  <groupId>a.group</groupId>
  <artifactId>a.artifact</artifactId>
  <version>a.version</version>
  <exclusions>
    <!--  STAX comes with Java 1.6 -->
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>javax.xml.stream</groupId>
    </exclusion>
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>stax</groupId>
    </exclusion>
  </exclusions>
<dependency>

1
यह ध्यान रखना आवश्यक है कि इस परिवर्तनशील निर्भरता का उपयोग किया जा सकता है और आवश्यकता होने पर बहिष्करण एक निर्माण विफलता का कारण बन सकता है।
बर्नहार्ड कॉलबी

यदि आप एक आधुनिक JDK (यानी 1.6+) का उपयोग कर रहे हैं और आपको एक सकर्मक निर्भरता के माध्यम से शामिल किए गए स्टैक्स के पुराने संस्करण की आवश्यकता है, तो आप शायद सभी प्रकार के भयानक रनटाइम क्लास लोडर मुद्दों में भाग लेंगे। मेरी सलाह: JDK में एक का उपयोग करें। यदि आपको "बिल्ड विफलता" मिलती है, तो आप किसी ऐसे फॉर्म के प्राचीन एपीआई पर भरोसा कर रहे हैं जिसे अपग्रेड किया जाना चाहिए। या: अपने JDK को 1.5 पर वापस रोल करें। उसके साथ अच्छा भाग्य।
स्कॉट

11

</dependencies>रूट पोम के टैग के अंदर जो आप डालते हैं, वह रूट पोम के सभी बाल मॉड्यूल द्वारा शामिल किया जाएगा। यदि आपके सभी मॉड्यूल उस निर्भरता का उपयोग करते हैं, तो यह जाने का तरीका है।

हालाँकि, यदि आपके 10 में से केवल 3 बाल मॉड्यूल कुछ निर्भरता का उपयोग करते हैं, तो आप नहीं चाहते कि यह निर्भरता आपके सभी चाइल्ड मॉड्यूल में शामिल हो। उस मामले में, आप सिर्फ अंदर निर्भरता डाल सकते हैं </dependencyManagement>। इससे यह सुनिश्चित हो जाएगा कि किसी भी चाइल्ड मॉड्यूल को जिस पर निर्भरता की आवश्यकता है, उसे अपनी पोम फाइल में घोषित करना होगा, लेकिन वे आपके </dependencyManagement>टैग में निर्दिष्ट निर्भरता के उसी संस्करण का उपयोग करेंगे ।

आप </dependencyManagement>ट्रांसेटिव निर्भरता में उपयोग किए गए संस्करण को संशोधित करने के लिए भी उपयोग कर सकते हैं , क्योंकि ऊपरी सबसे पोम फ़ाइल में घोषित संस्करण वह है जिसका उपयोग किया जाएगा। यह तब उपयोगी हो सकता है जब आपके प्रोजेक्ट A में एक बाहरी प्रोजेक्ट B v1.0 शामिल हो जिसमें एक और बाहरी प्रोजेक्ट C v1.0 शामिल हो। कभी-कभी ऐसा होता है कि प्रोजेक्ट C v1.0 में एक सिक्योरिटी ब्रीच पाया जाता है जिसे v1.1 में सही किया गया है, लेकिन B के डेवलपर्स सी के v1.1 का उपयोग करने के लिए अपने प्रोजेक्ट को अपडेट करने में धीमे हैं, उस स्थिति में, आप बस घोषणा कर सकते हैं `अंदर अपनी परियोजना के रूट पोम में C v1.1 पर निर्भरता, और सब कुछ अच्छा होगा (यह मानते हुए कि B v1.0 अभी भी C v1.1 के साथ संकलन करने में सक्षम होगा)।


10

मुझे तीसरे पक्ष के पुस्तकालय में एक निर्भरता पर काबू पाने में भी परेशानी हुई। मैंने बहिष्कार के साथ स्कॉट के दृष्टिकोण का इस्तेमाल किया लेकिन मैंने पोम में नए संस्करण के साथ निर्भरता को भी जोड़ा। (मैंने मावेन 3.3.3 का इस्तेमाल किया)

तो stax उदाहरण के लिए यह इस तरह दिखेगा:

<dependency>
  <groupId>a.group</groupId>
  <artifactId>a.artifact</artifactId>
  <version>a.version</version>
  <exclusions>
    <!--  STAX comes with Java 1.6 -->
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>javax.xml.stream</groupId>
    </exclusion>
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>stax</groupId>
    </exclusion>
  </exclusions>
<dependency>

<dependency>
    <groupId>javax.xml.stream</groupId>
    <artifactId>stax-api</artifactId>
    <version>1.0-2</version>
</dependency>

1

स्वीकृत उत्तर सही है लेकिन मैं अपने दो सेंट जोड़ना चाहूंगा। मैं एक समस्या में भाग गया हूं, जहां मेरे पास एक प्रोजेक्ट A था जो एक निर्भरता के रूप में एक प्रोजेक्ट B था। दोनों प्रोजेक्ट्स slf4j का उपयोग करते हैं, लेकिन प्रोजेक्ट B लॉगबैक का उपयोग करता है जबकि प्रोजेक्ट A लॉगबैक का उपयोग करता है। प्रोजेक्ट बी slf4j 1.6.1 का उपयोग करता है, जबकि प्रोजेक्ट A slf4j 1.7.5 का उपयोग करता है (पहले से ही लॉगबैक 1.2.3 निर्भरता के कारण)।

समस्या: प्रोजेक्ट A एक फ़ंक्शन नहीं खोज सका जो कि slf4j 1.7.5 पर मौजूद है, एक्लिप की निर्भरता पदानुक्रम टैब की जाँच करने के बाद मुझे पता चला कि निर्माण के दौरान यह प्रोजेक्ट बी से slf4j 1.6.1 का उपयोग कर रहा था, बजाय लॉगबैक के slf4j 1.7.5 का उपयोग करने के लिए। ।

मैंने प्रोजेक्ट A pom पर निर्भरता के क्रम को बदलकर समस्या हल की, जब मैंने logback प्रविष्टि के नीचे प्रोजेक्ट B प्रविष्टि को स्थानांतरित किया तो maven ने slf4j 1.7.5 का उपयोग करके परियोजना का निर्माण करना शुरू कर दिया।

संपादित करें: Project B निर्भरता पर काम करने से पहले slf4j 1.7.5 निर्भरता को जोड़ना।

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