2013-11-14 19 views
10

मैं uber-jar बनाने के लिए मेवेन-शेड-प्लगइन का उपयोग करना चाहता हूं। लेकिन जब मैं mvn package कमांड करता हूं तो मैवेन रिपोर्ट करता है कि कुछ अतिव्यापी कक्षाएं हैं। मैं सभी समस्याग्रस्त ओवरलैप को जोड़ रहा हूं, उनमें से कुछ कारण हैं क्योंकि लाइब्रेरी के पुराने और नए संस्करण (लॉग 4 जे), लेकिन उनमें से कुछ के समान वर्ग हैं - उदा। javax.mail और mailapi/smtp/imap et cetera।मेवेन-शेड-प्लगइन, उबेर-जार और ओवरलैपिंग क्लासेस

इस स्थिति में क्या करना सबसे अच्छा है? क्या कुछ महत्वपूर्ण तरीका है कि यह तय करने के लिए कि किस ओवरलैपिंग को अनदेखा करना सुरक्षित है, जिसे सही होने की आवश्यकता है?

- mailapi-1.4.3.jar, javax.mail-1.5.0.jar define 166 overlappping classes 
- spring-2.5.6.SEC03.jar, spring-tx-3.1.4.RELEASE.jar define 176 overlappping classes: 
- spring-beans-3.1.4.RELEASE.jar, spring-2.5.6.SEC03.jar define 283 overlappping classes: 
- slf4j-log4j12-1.7.5.jar, slf4j-impl-2.0-beta2.jar define 3 overlappping classes: 
- spring-2.5.6.SEC03.jar, spring-context-support-3.1.4.RELEASE.jar define 55 overlappping classes: 
- aopalliance-1.0.jar, spring-2.5.6.SEC03.jar define 9 overlappping classes: 
- imap-1.5.0.jar, javax.mail-1.5.0.jar define 87 overlappping classes: 
- commons-logging-api-1.1.jar, commons-logging-1.1.3.jar define 19 overlappping classes: 
- spring-2.5.6.SEC03.jar, spring-core-3.1.4.RELEASE.jar define 161 overlappping classes: 
- spring-2.5.6.SEC03.jar, spring-context-3.1.4.RELEASE.jar define 326 overlappping classes: 
- log4j12-api-2.0-beta3.jar, log4j-1.2.17.jar define 23 overlappping classes: 
- spring-aop-3.1.4.RELEASE.jar, spring-2.5.6.SEC03.jar define 237 overlappping classes: 
- spring-jdbc-3.1.4.RELEASE.jar, spring-2.5.6.SEC03.jar define 239 overlappping classes: 
- quartz-1.8.6.jar, quartz-jobs-2.2.1.jar define 15 overlappping classes: 
- smtp-1.5.0.jar, javax.mail-1.5.0.jar define 17 overlappping classes: 
- spring-asm-3.1.4.RELEASE.jar, spring-2.5.6.SEC03.jar define 31 overlappping classes: 

संपादित करें: इस आवेदन 'ए' मेरी एक और जावा अनुप्रयोग निर्भरता एक Maven के रूप में उपयोग करता है - मैं इस एप्लिकेशन को 'बी' फोन करता हूँ। यह बी अनुप्रयोग javax.mail ver 1.5.1 का उपयोग करता है। यह पुस्तकालय भी पहले आवेदन का उपयोग करता है। लेकिन जब मैं एमवीएन पैकेज कमांड को कॉल करता हूं, तो मैवेन ने javax.mail-api-1.5.1.jar, javax.mail-1.5.1.jar define 135 overlappping classes नोटिस किया।

क्या यह समस्या है और यदि ऐसा है, तो इसे कैसे हल करें या मैं इसे अनदेखा कर सकता हूं?

उत्तर

2

करने वाली पहली चीज़ ओवरलैपिंग कक्षाओं के स्पष्ट कारणों के रूप में हटा सकती है जितनी आप कर सकते हैं। उदाहरण के लिए:

  • आपके पास बसंत 2.5.6 और वसंत 3.1.4 दोनों पर निर्भरता है, जो आपको छाया प्लगइन की तुलना में अधिक समस्याएं प्रदान करेगी। अपनी मॉड्यूल निर्भरता सेट अप करें ताकि आपके पास वसंत का केवल एक संस्करण हो। निर्भरता बहिष्करण का उपयोग करें यदि आपको करना है (कहें कि आपके पास पारस्परिक निर्भरताएं हैं जिन्हें आप नियंत्रित नहीं करते हैं)।
  • एक बार निर्भरता संस्करण संघर्ष तय कर रहे हैं, आप भी कॉन्फ़िगर कर सकते हैं http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html
  • पर वर्णन किए गए जार में से कुछ जो जार, छाया प्लगइन विन्यास के साथ uber-जार में जाने शायद उनके ओवरलैपिंग जार से कक्षाओं के सभी शामिल ।
    • मुझे संदेह है कि कॉमन्स-लॉगिंग-1.1.3.jar में कॉमन्स-लॉगिंग-एपीआई-1.1.jar में घोषित कक्षाओं का एक सुपरसेट है। यदि ऐसा है, तो आप एपी जार को बाहर कर सकते हैं।
    • संपादित प्रश्न के जवाब में, javax.mail-1.5.1.jar में javax.mail-api-1.5.1.jar में कक्षाओं का एक सुपरसेट शामिल है। चूंकि ये स्पष्ट रूप से एक ही संस्करण हैं और ओवरलैपिंग कक्षाएं समान होनी चाहिए, इसलिए ओवरलैपिंग कक्षाओं के साथ छायांकित जार बनाने के लिए कोई नुकसान नहीं होगा (यह कक्षाओं को जो भी जार से पिछली प्रक्रियाओं से ले जाएगा)। हालांकि, अगर आप एपी जार को बाहर करते हैं तो बिल्ड कम और थोड़ा तेज़ होगा।

यह संभावना नहीं है कि आप छायांकित जार में कक्षाओं के परस्पर विरोधी संस्करणों को बनाए रखने की आवश्यकता होगी है। यदि आप करते हैं, छाया प्लगइन भी कक्षाओं के स्थानांतरण, http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

+0

मैंने अपनी मूल पोस्ट में एक और प्रश्न जोड़ा। – user2148736

3

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

$ **mvn dependency:tree -Dverbose -Dincludes=aopalliance** 
[INFO] Scanning for projects... 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building petshop cli 1.0 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ cli --- 
[INFO] com.sample.petshop:cli:jar:1.0 
[INFO] \- **org.springframework:spring-context**:jar:4.1.3.RELEASE:compile 
[INFO] \- org.springframework:spring-aop:jar:4.1.3.RELEASE:compile 
[INFO]  \- **aopalliance:aopalliance**:jar:1.0:compile 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 5.865s 
[INFO] Finished at: Fri May 08 15:12:01 IST 2015 
[INFO] Final Memory: 14M/223M 
[INFO] ------------------------------------------------------------------------ 

aopalliance जार वसंत-संदर्भ समर्थन जो इंगित करता है कि हम संभवतः यह बाहर कर सकते हैं से संदर्भित किया जा रहा है।

0

यह प्रश्न this one डुप्लिकेट करता है, जहां आप अधिक उदाहरण पा सकते हैं।

लेकिन अगर आपको यकीन है कि आपके पास ओवरलैपिंग निर्भरताएं नहीं हैं (जैसे मेरे पास), clean आईएनजी परियोजना मदद कर सकती है। this answer for more details

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