2011-10-26 12 views
23

उदाहरण के लिए, मेरे पास 2 मेवेन परियोजनाएं हैं। एक "परियोजना-अभिभावक" है। दूसरा "प्रोजेक्ट-चाइल्ड" है। जाहिर है, "प्रोजेक्ट-चाइल्ड" "प्रोजेक्ट-पैरेंट" की उप परियोजना है।मैवेन में माता-पिता की परियोजना से निर्भरता को कैसे बाहर निकालना है?

"प्रोजेक्ट-पैरेंट" की लॉग 4j की निर्भरता है। लेकिन मैं इसे "प्रोजेक्ट-चाइल्ड" से बाहर करना चाहता हूं। क्या उधर रास्ता है?

आप कह सकते हैं कि मुझे "प्रोजेक्ट-पैरेंट" से "प्रोजेक्ट-चाइल्ड" में लॉग 4j ले जाना चाहिए। यह बिल्कुल सही है। लेकिन धारणा है कि मैं "प्रोजेक्ट-पैरेंट" के पीओएम को संशोधित नहीं कर सकता।

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

उत्तर

9

मुझे लगता है कि मेवेन 2 में यह हासिल करने का कोई तरीका नहीं है, क्योंकि पीओएम विरासत के लिए है। हालांकि एक चाल है जिसे मैं सोच सकता हूं:

मान लें कि आपको अपने आंतरिक आर्टिफैक्ट भंडार में आर्टिफैक्ट अपलोड करने का अधिकार है। आप एक खाली जार बना सकते हैं, इसे log4j के रूप में तैनात करें: log4j, स्पष्ट रूप से असामान्य संस्करण (उदा। Log4j: log4j: 9999) के साथ। अपने प्रोजेक्ट-बच्चे में ऐसी निर्भरता जोड़ें। फिर यह माता-पिता की निर्भरता को ओवरराइड करने के लिए एक वास्तविक तथ्य वाले जेएआर पर निर्भर करेगा।

+1

एक ओर ध्यान दें: कोई समान बात कर और "खाली" कलाकृतियों के इस तरह के लिए एक सार्वजनिक भंडार प्रदान की जाती है (http://version99.qos.ch/) । वे संस्करण के रूप में '99-खाली' का उपयोग करते हैं। लोग मानते हैं कि मेरे द्वारा सुझाए गए दृष्टिकोण का उपयोग इस सम्मेलन के रूप में कर सकते हैं। –

1

यदि मैं प्रश्न समझता हूं, तो आपको निम्न की तरह कुछ चाहिए। यह एक निर्भरता में खींचता है और उस निर्भरता को अपनी निर्भरता सूची में जोड़ने से बाहर करता है। अक्सर इसका उपयोग तब किया जाता है जब आप दूसरे पैकेज में संदर्भित एक के बजाय पैकेज के नए संस्करण को इंजेक्ट करना चाहते हैं।

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.15</version> 
    <exclusions> 
     <exclusion> 
      <groupId>com.sun.jmx</groupId> 
      <artifactId>jmxri</artifactId> 
     </exclusion> 
     ... 
    </exclusions> 
    ... 

आप के बजाय एक <parent> रिश्ते के बारे में बात कर रहे हैं तो मुझे यकीन है कि वहाँ यह करने के लिए एक रास्ता है नहीं कर रहा हूँ। क्या आप <parent> से <dependency> पर स्विच कर सकते हैं?

+0

मेरा मतलब है मूल परियोजना से विरासत निर्भरता, आपके उदाहरण के रूप में प्रत्यक्ष निर्भरता से पारगमन निर्भरता नहीं। वैसे भी, बहुत बहुत धन्यवाद। :) – Smartmarkey

+0

हाँ, मुझे यकीन नहीं है कि आप ऐसा कर सकते हैं या नहीं। क्या आपको यह प्रश्न दिखाई देता है: http://stackoverflow.com/questions/2681759/is-there-anyway-to-exclude-artifacts-inherited-from-a-parent-pom – Gray

+0

लिंक के लिए धन्यवाद। मैंने इसे पढ़ लिया है। ऐसा लगता है कि औपचारिक रूप से मेवेन में कोई रास्ता नहीं है। मुझे कामकाज करना है। – Smartmarkey

9

मुझे वास्तव में निर्भरता को छोड़ने का एक तरीका पता नहीं है, लेकिन आप इसे लक्ष्य वितरण से बाहर कर सकते हैं, लेकिन यह एक हैक का थोड़ा सा है। आपको निर्भरता के दायरे को उस चीज़ पर बदलने की जरूरत है जिसे आप अंतिम वितरण में बहिष्कृत कर सकते हैं।

तो, का कहना है कि मेरे माता-पिता JUnit 4.8 पर निर्भरता था, मेरी पोम में आप कहते हैं: करने के लिए प्रदान

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.8</version> 
    <scope>provided</scope> 
</dependency> 

तो हम गुंजाइश बदल रहे हैं। यह कैसे काम करता है इसकी व्याख्या के लिए, मेरा उत्तर NoClassDefFoundError: org/junit/AfterClass during annotation processing पर देखें। दुर्भाग्य से, इस बिल्ड को प्रभावित नहीं करता है, लेकिन जब आप यह वितरण के लिए निर्भरता कॉपी कर रहे हैं, तो आप excludeScope विन्यास तत्व का उपयोग अंतिम वितरण में निर्भरता की प्रतिलिपि नहीं करने के लिए कर सकते हैं:

<plugin> 
<artifactId>maven-dependency-plugin</artifactId> 

<executions> 
    <execution> 
     <id>copy-libs</id> 
     <phase>package</phase> 
     <goals> 
      <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
      <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      <excludeScope>provided</excludeScope> 
     </configuration> 
    </execution> 
+0

धन्यवाद। मैंने वितरण पैकेज से अवांछित निर्भरताओं को बाहर रखा है, लेकिन मैं इसके लिए मेवेन असेंबली प्लगइन के assembly.xml में का उपयोग कर रहा हूं। मैं ग्रहण पर्यावरण से अवांछित निर्भरताओं को बाहर करने का एक तरीका मांग रहा हूं, जैसे ग्रहण। :) – Smartmarkey

0

एक hacky रास्ता इसे पूरा करने के लिए प्रोजेक्ट-चाइल्ड में निर्भरता निर्दिष्ट करना है, लेकिन 'टेस्ट' स्कोप (या जो भी हल्का वजन वाला स्कोप उपलब्ध है) के साथ। यह प्रोजेक्ट-पैरेंट में निर्दिष्ट दायरे को "छुपा" देगा ताकि यह केवल परीक्षण कोड के लिए उपलब्ध हो और दोनों संकलन और रनटाइम पर गैर-परीक्षण कोड के लिए अनुपलब्ध हो।

मैं इस बग-फीचर में ज्यादातर गलती से आया था। मेरे मामले में, मेरे प्रोजेक्ट-बच्चे के पास 'संकलन' स्कोप निर्भरता के साथ एक प्रोजेक्ट-भाई थी, जबकि प्रोजेक्ट-पैरेंट के पास 'प्रदत्त' दायरे के साथ निर्दिष्ट समान निर्भरता (वास्तव में दादा से विरासत में मिली) थी। प्रोजेक्ट-चाइल्ड एक निष्पादन योग्य था, हालांकि परियोजना-भाई पर निर्भर था, और इसलिए परियोजना-भाई से रनटाइम पर नोक्लास डीफफाउंड एरर फेंक दिया गया था क्योंकि परियोजना-बच्चे के रनटाइम क्लासपाथ का उपयोग किया जा रहा था, जिसमें 'प्रदत्त' निर्भरता शामिल नहीं थी।मैंने परियोजना-भाई से प्रोजेक्ट-पैरेंट तक 'संकलन' निर्भरता को स्थानांतरित करके इसे ठीक किया ताकि 'संकलित' 'प्रदान किया गया' छिपाए।

1

मैं आपके जैसा ही प्रश्न पूछता हूं। मेरी प्रोजेक्ट में, माता-पिता को कॉल करें parent.pom parent.pom है। माता-पिता log4j परिभाषित, इस तरह slf4j:

 <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>${slf4j-api.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>${log4j.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>jcl-over-slf4j</artifactId> 
      <version>${slf4j-api.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>${slf4j-log4j12.version}</version> 
     </dependency> 

बच्चे परियोजना child.pom में कुछ निर्भरता आह्वान। लेकिन मैं log4j-1.2.x निर्भरता नहीं चाहता हूं और slf4j के संस्करण को बढ़ाना चाहता हूं।

तो। मैं माता पिता की निर्भरता को जोड़ने

<dependency> 
     <groupId>parent</groupId> 
     <artifactId>myartifactId</artifactId> 
     <version>${my parent version}</version> 
</dependency> 

और बहिष्करण का उपयोग log4j

<dependency> 
     <groupId>parent</groupId> 
     <artifactId>myartifactId</artifactId> 
     <version>${my parent version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
</dependency> 

दूर करने के लिए और स्पष्ट रूप से

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-slf4j-impl</artifactId> 
     <version>2.8.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.8.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.8.2</version> 
    </dependency> 

    <dependency> 
     <groupId>com.lmax</groupId> 
     <artifactId>disruptor</artifactId> 
     <version>3.3.4</version> 
    </dependency> 

तो slf4j और बच्चे पोम में log4j2 की निर्भरता को जोड़ने एमवीएन निर्भरता का उपयोग करें: पेड़ निर्भरता सूची दिखाने के लिए, अभी भी अच्छी तरह log4j

[INFO] +- org.apache.kafka:kafka_2.10:jar:0.8.2.0:compile 
[INFO] | +- com.yammer.metrics:metrics-core:jar:2.2.0:compile 
[INFO] | +- org.scala-lang:scala-library:jar:2.10.4:compile 
[INFO] | +- org.apache.zookeeper:zookeeper:jar:3.4.6:compile 
[INFO] | | +- org.slf4j:slf4j-log4j12:jar:1.7.5:compile 
[INFO] | | +- log4j:log4j:jar:1.2.17:compile 

देखते हैं, कि निर्भरता पर बहिष्करण जोड़ने ... इस आदमी को दूर करते हैं।

<dependency> 
     <groupId>org.apache.kafka</groupId> 
     <artifactId>kafka-clients</artifactId> 
     <version>0.10.1.1</version> 
     <exclusions> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

फिर निर्भरता सूची की जांच के लिए फिर से आदेश चलाएं। ठीक! स्पष्ट ~

आशा आप मदद कर सकते हैं:>

संबंधित मुद्दे

 संबंधित मुद्दे