2012-03-21 11 views
24

है किसी को भी पता है कि मेरे मेवेन के निर्माण के साथ क्या हुआ? मुझे बहुत सारी डुप्लिकेट चेतावनियां मिल रही हैं।मेवेन बिल्ड [चेतावनी] हमारे पास एक डुप्लिकेट क्लास

[WARNING] We have a duplicate org/apache/commons/logging/impl/LogFactoryImpl$1.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar 
[WARNING] We have a duplicate org/apache/commons/logging/impl/LogFactoryImpl.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar 
[WARNING] We have a duplicate org/apache/commons/logging/impl/NoOpLog.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar 
[WARNING] We have a duplicate org/apache/commons/logging/impl/SimpleLog$1.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar 
[WARNING] We have a duplicate org/apache/commons/logging/impl/SimpleLog.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar 
[WARNING] We have a duplicate org/apache/commons/logging/impl/Jdk14Logger.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar 

मैं अपने स्थानीय एम 2 रेपो में देखा है, मैं आम-प्रवेश-api जार, LogFactoryImpl.class और LogFactoryImpl $ 1.class में वहाँ दो वर्गों की है। चेतावनियों में उल्लिखित सभी वर्गों के समान।

उल्लेख करने की एक बात यह है कि मैं अपने pom.xml में छाया प्लगइन का उपयोग कर रहा हूं।

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>1.4</version> 
      <configuration> 
       <createDependencyReducedPom>true</createDependencyReducedPom> 
       <filters> 
        <filter> 
         <artifact>*:*</artifact> 
         <excludes> 
          <exclude>META-INF/*.SF</exclude> 
          <exclude>META-INF/*.DSA</exclude> 
          <exclude>META-INF/*.RSA</exclude> 
         </excludes> 
        </filter> 
       </filters> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.~~~~black out my own main class here~~~~~</mainClass> 
          </transformer> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

मैंने देखा है कि निर्भरता वृक्ष के रूप में नीचे

[INFO] +- org.apache.cxf:cxf-bundle-jaxrs:jar:2.5.1:compile 
[INFO] | \- commons-logging:commons-logging:jar:1.1.1:compile 
[INFO] \- org.apache.hadoop.hive:hive-jdbc:jar:0.7.1-cdh3u3:compile 
[INFO] \- org.apache.hadoop.hive:hive-common:jar:0.7.1-cdh3u3:compile 
[INFO]  \- commons-logging:commons-logging-api:jar:1.0.4:compile 

और की तरह लग रहा कॉमन्स-logging.jar और कॉमन्स-प्रवेश-api.jar दोनों org/अपाचे/कॉमन्स/प्रवेश/LogFactory है। कक्षा।

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

+1

LogFactoryImpl.class और LogFactoryImpl $ 1. नाम में $ 1 के साथ क्लास क्लास LogFactoryImpl के अंदर स्थानीय कक्षा है। – khmarbaise

उत्तर

8

Maven doc में "निर्भरता बहिष्करण" अनुभाग पर नज़र डालें।

आपके प्रदत्त उदाहरण में, मैं commons-logging:commons-logging-api:jar:1.0.4:compile निर्भरता org.apache.hadoop.hive:hive-common:jar:0.7.1-cdh3u3:compile से बाहर कर दूंगा। आपके pom.xml में:

<dependency> 
     <groupId>org.apache.hadoop.hive</groupId> 
     <artifactId>hive-common:jar</artifactId> 
     <version>0.7.1-cdh3u3</version> 
     <exclusions> 
      <exclusion> 
       <groupId>commons-logging</groupId> 
       <artifactId>commons-logging-api</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
+0

बहुत बहुत धन्यवाद, यह समझ में आता है। तो इस तरह निर्भरताओं का प्रबंधन करने का सबसे अच्छा तरीका क्या है। मान लीजिए, आपके पास projectA.jar, projectB.jar है, उनके पास अलग-अलग संस्करणों में समान निर्भरताएं हैं। जैसे। निर्भरता .1.0, निर्भरता.2.0। इसमें केवल एक का उपयोग करने का जोखिम है। क्या ProjectA को depdency.1.0 का उपयोग करने देता है, जबकि ProjectB अभी भी निर्भरता.2.0 का उपयोग करता है? – Shengjie

+1

नहीं, कोई रास्ता नहीं है (शायद ओएसजीआई के साथ लेकिन मैं इस क्षेत्र में एक विशेषज्ञ नहीं हूं)। इस मामले में, यह क्लास लोडर है जो कक्षा का उपयोग करने के लिए चुनता है (ओएस, जेवीएम इत्यादि के आधार पर ..., अक्सर क्लासपाथ में संदर्भित पहला जार होता है)। आपकी सबसे अच्छी शर्त नवीनतम संस्करण (अन्य संस्करणों को छोड़कर) लेना है, उम्मीद है कि यह पिछड़ा संगत है ... लेकिन यह क्लासलोडर को आपके लिए चुनने से बेहतर है। –

0

आपके पास अपने पोम में निर्भरताएं हैं जिनमें डुप्लिकेट कक्षाएं हैं लेकिन उचित पोम के बिना मैं इसके बारे में कोई शब्द नहीं कह सकता।

+0

अधिक जानकारी जोड़ा गया, क्या आप इसे फिर से देख सकते हैं? धन्यवाद – Shengjie

+0

क्या आपने जांच की है कि किस निर्भरता में डुप्लिकेट कक्षाएं हैं? आपके आउटपुट के आधार पर कॉमन्स-लॉगिंग-एपीआई-1.0.4.जर जो एक अलग एपीआई संस्करण (डुप्लीकेट) का उपयोग करने से आ रहा था या आप एक अन्य लॉगिंग प्रदाता (slf4j?) का उपयोग कर रहे हैं। – khmarbaise

8

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

यह समस्या अभी भी Maven-शेडर-प्लगइन 2.0 के रूप में बिना पते है: http://jira.codehaus.org/browse/MSHADE-126

एक वैकल्पिक हल अपने pom.xml करने के लिए स्पष्ट रूप से Maven-जार-प्लगइन जोड़ सकते हैं और विन्यास <forceCreation>true</forceCreation> की स्थापना जोड़ना है।

+0

यही कारण है कि यह मेरे लिए हुआ। आप यहां समाधान का पालन करके इसे हल कर सकते हैं: http://stackoverflow.com/questions/8880361/superfluous-warnings-when-using-maven-shade-plugin – stantonk

3

मेरे मामले, मेरे माता-पिता पोम कॉमन्स-beanutils और मेरे बच्चे मॉड्यूल (जो केवल एक चीज मैं संकलन करना चाहता था है) सहित किया गया था सहित कॉमन्स-कब किया गया था।

शैड प्लग में डुप्लिकेट के बारे में शिकायत की गई क्योंकि कॉमन्स-आईओ और कॉमन्स-बीन्सुटिल ने कुछ सामान्य वर्ग साझा किए। ध्यान दें कि बीन्सुतिल को शामिल किया जा रहा था, भले ही इसकी आवश्यकता नहीं थी, और इसका उपयोग नहीं किया गया था।

मैं विन्यास को यह जोड़कर जार कम करके इस समस्या के समाधान:

<minimizeJar>true</minimizeJar> 

अब छाया प्लगइन अप्रयुक्त संसाधन जोड़ नहीं था।

चेतावनी चला गया।

1

आप जार आप नहीं चाहते (जो कि छाया प्लगइन के अंतर्गत निम्नलिखित टैग का उपयोग नकली चेतावनी दे रहे हैं बाहर कर सकते हैं -

<configuration> 
    <artifactSet> 
     <excludes> 
     <exclude>commons-logging:commons-logging</exclude> 
     </excludes> 
    </artifactSet> 
    <minimizeJar>true</minimizeJar> 
    </configuration> 

अधिक जानकारी http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html

0

में पाया जा सकता मैं इस ग्रहण में हो सकता है जब मैं अपने माता पिता परियोजना की निर्भरता अद्यतन देखा।

मैं अपने लक्ष्य निर्देशिका में सभी फाइलों को नष्ट कर दिया है और यह समस्या हल कर ली।

0

उपरोक्त सभी (निर्भरता पेड़ की समीक्षा करने और हटाने के बारे में) अधिकांश मामलों में सही है, लेकिन मेरे मामले में (मैं अपने निर्भरता में ओवरलैपिंग नहीं था) प्रारंभिक clean मदद की (क्यों हालांकि पता नहीं है):

mvn clean package

0

मेरे मामले में मैं एक पैकेज पर भरोसा कर रहा था जो एक छायांकित जार भी बनाता है।

छायांकित जार तैनाती के लिए हैं, निर्भरता के रूप में स्थापित नहीं हैं।

निर्भरता की निर्माण प्रक्रिया के दौरान कम निर्भरता पीओएम बनाना, मेवेन को निर्देशित करता है जिस पर निर्भरताओं को छोड़ दिया जा सकता है।

Maven-छाया-प्लगइन विन्यास में:

<configuration> 
    <createDependencyReducedPom>false</createDependencyReducedPom> 
</configuration> 

अधिक जानकारी के लिए इस पोस्ट देखें:

What is the maven-shade-plugin used for, and why would you want to relocate java packages?

त्रुटि मैं Maven से हो रही थी:

चेतावनी: x.jar, y.jar में ओवरलैपिंग कक्षाएं

शामिल हैं
संबंधित मुद्दे