2017-06-19 10 views
5

मेरे पास Maven जावा वेब ऐप (.WAR) प्रोजेक्ट है जिसमें Wicket लाइब्रेरी समेत कई पुस्तकालय शामिल हैं (लेकिन मुझे नहीं लगता कि समस्या स्वयं विकेट है, बल्कि मैवेन के साथ)।मैवेन समान निर्भरता के कई संस्करणों सहित क्यों है?

यहाँ समस्या है:, 6.20.0 और 6.18.0 के रूप में आप इस स्क्रीनशॉट में देख सकते हैं:: यहां तक ​​कि यद्यपि मैं केवल Wicket 6.20.0 में शामिल हैं, जिसके परिणामस्वरूप .WAR दो प्रतियां विकेट पुस्तकालयों के शामिल

enter image description here

कुछ विवादित आयातों के बारे में सोचते हुए मैंने निर्भरता पेड़ को मुद्रित किया:

mvn dependency:tree 

कमनाड ... लेकिन निर्भरता पेड़ में विकेट 6.18.0 का कोई उल्लेख नहीं है! मैंने एक्लिप्स के "निर्भरता पदानुक्रम" दृश्य का उपयोग करके दोबारा जांच भी की है और मैं पुष्टि कर सकता हूं कि उस आयात का कोई निशान नहीं है।

मैंने ग्रहण के साथ पूरे कार्यक्षेत्र में स्ट्रिंग "6.18.0" की खोज भी की, लेकिन यह कहीं भी नहीं मिला है!

पुस्तकालय के उस डुप्लिकेट संस्करण को शामिल करने का कारण क्या हो सकता है?

+3

आप अपने पोम पोस्ट कृपया:

मैं युद्ध प्लगइन में स्पष्ट बहिष्कार को विन्यस्त द्वारा हल किया? – BackSlash

उत्तर

5

मैवेन इस तरह से काम नहीं करता है।
एक ही आर्टिफैक्ट आईडी और समूह आईडी के साथ एक से अधिक निर्भरता का संकल्प लेकिन एक अलग संस्करण के साथ एक निर्भरता का परिणाम होगा (संस्करण का उपयोग कोई निर्धारक नहीं है)।

ही artifactId और ग्रुप लेकिन दो अलग-अलग संस्करणों के साथ युद्ध की एक ही lib फ़ोल्डर में साथ दो कलाकृतियों की उपस्थिति शायद इनमें से किसी एक से संबंधित है:

  • आप mvn clean package निष्पादित नहीं लेकिन केवल mvn package

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

  • आपके पास एक मेवेन प्लगइन है जो घटक के निर्माण के दौरान लक्षित फ़ोल्डर के WEB-INF/lib फ़ोल्डर में विकेट जार 6.18.0 की प्रतिलिपि बनाता है।

  • आपके द्वारा बनाई जा रही मेवेन वायर प्रोजेक्ट के रूप में निर्भरता के रूप में प्रकार की आर्टिफैक्ट निर्भरता है। इस मामले में, WAR प्रॉपर्टी की निर्भरताएं आपके द्वारा बनाई गई WAR प्रोजेक्ट में overlaid हैं।


दोहराया JAR क्योंकि युद्ध निर्भरता के बारे में एक दिलचस्प Maven मुद्दा:

JARs with different versions can be in WEB-INF/lib with war as dependencies


Your answer और अपने comment संकेत मिलता है कि वास्तव में आप अपने निर्माण में एक युद्ध निर्भरता है।
दुर्भाग्यवश, इस सीमा को बाईपास करने के लिए वास्तव में एक अच्छा और दीर्घकालिक प्रभावी समाधान नहीं है।

के रूप में मेरी टिप्पणी में कहा, वास्तविक मुद्दे के लिए Maven युद्ध प्लगइन का packagingExcludes संपत्ति एक वैध तरीके को इस्तेमाल कर रहा है:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <!-- ... --> 
     <packagingExcludes>WEB-INF/lib/wicket-*-6.18.0.jar</packagingExcludes> 
    </configuration> 
</plugin> 

लेकिन सावधान रहना, कि का उपयोग करते हुए समय के माध्यम से कम मजबूत अपने निर्माण करेंगे। वह दिन जहां आप WAR निर्भरता के संस्करण को अपडेट करते हैं और अपने नए संस्करण में, यह फिर से विकेट का एक अलग संस्करण खींचता है, फिर भी आपके पास अपने निर्मित युद्ध में दो अलग-अलग संस्करणों के साथ डुप्लिकेट जार रखने का जोखिम है।

maven-war-plugin की overlay तत्व निर्दिष्ट द्वारा the overlay सुविधा का उपयोग करना आम तौर पर बेहतर रूप में यह ओवरले युद्ध निर्भरता के लिए आवेदन पर केंद्रित है। यह समस्या को जल्दी हल करता है। नतीजतन, आप युद्ध निर्भरता से किसी भी विकेट के जार को बाहर करने के निर्धारित कर सकते हैं:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <version>2.4</version> 
    <artifactId>maven-war-plugin</artifactId> 
    <configuration>  
     <overlays> 
      <overlay> 
       <groupId>com.whatever.youlike</groupId> 
       <artifactId>myArtifact</artifactId> 
       <excludes> 
        <exclude>WEB-INF/lib/wicket-*.jar</exclude>     
       </excludes> 
      </overlay> 
     </overlays> 
    </configuration> 
</plugin> 

इस तरह बेहतर है, लेकिन यह अभी भी एक समाधान नहीं है।
वह दिन जहां निर्भरता युद्ध अद्यतन किया गया है और यह आपके वास्तविक निर्माण में घोषित नई निर्भरताओं (विकेट के अलावा) खींचता है लेकिन विभिन्न संस्करणों के साथ, आप एक ही तरह के मुद्दे के साथ समाप्त कर सकते हैं।

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

+0

+1, क्योंकि आपका पहला बुलेट बिंदु मुझे सही दिशा में इंगित करता है, विवरण के लिए नीचे मेरा उत्तर देखें। असल में, यह एक निर्भरता थी, लेकिन "WAR" प्रकार की निर्भरता (मुझे लगता है कि उन्हें ओवरले कहा जाता है?)। ये बिल्ड पेड़/डीपी में दिखाई नहीं देते हैं। स्पष्ट रूप से पदानुक्रम। –

+0

WAR के रूप में पैक किए गए आर्टिफैक्ट में एक युद्ध प्रकार निर्भरता सहित, आपके द्वारा देखी गई कारणों के लिए दृढ़ता से निराश किया गया है। यह 'निर्भरता: पेड़' में नहीं दिखाया गया है क्योंकि यह निर्भरता संकल्प का हिस्सा नहीं बनता है। यह lib/WAR निर्मित घटक में lib/WAR निर्भरता में निहित "कच्चे" तरीके जार में प्रतिलिपि बनाता है। क्षमा करें मुझे सही नाम पता नहीं है: राक्षस ट्रक कॉपी शायद? ;) – davidxxx

+1

मैंने संपादन के बाद आपका जवाब स्वीकार कर लिया है, क्योंकि मैं अपने उत्तरों को स्वीकार करने से नापसंद करता हूं: डी विशिष्ट विवरण में रुचि रखने वाले किसी भी व्यक्ति को नीचे अपना उत्तर देखें: https://stackoverflow.com/a/44632079/300741 –

0

क्योंकि अन्य libs ही libs लेकिन भिन्न संस्करण का उपयोग कर सकते हैं या आप अलग संस्करण की कोशिश की और mvn clean

+0

मैं प्रत्येक निर्माण पर सफाई कर रहा था। समस्या एक अलग थी, विवरण के लिए मेरा अपना जवाब देखें। सुझाव देने के लिए वैसे भी धन्यवाद। –

1

उपयोग clean install नहीं किया और डबल निर्भरता शायद चला जाएगा।

+0

मैं हमेशा साफ करता हूं;) समस्या एक अलग थी, नीचे अपना जवाब देखें। आपकी मदद के लिए वैसे भी धन्यवाद। –

0

कमांड mvn dependency:tree आपको सही जानकारी बता रहा है - जो आप यहां देख रहे हैं वह एक ग्रहण/निर्माण समस्या है।

अपने लक्ष्य में सभी लक्ष्य और निर्माण क्षेत्र साफ़ करें। यदि आवश्यकता हो, तो इसे स्रोत नियंत्रण से नए फ़ोल्डर में देखें।

वैकल्पिक रूप से आप इंटेलिजे आईडीईए में अपनी परियोजना का निर्माण कर सकते हैं, और देख सकते हैं कि आपको सही निर्भरताएं मिलती हैं (संभवतः आप करेंगे)।

2

ठीक है, मैंने इसे चारों ओर घूमते हुए बाहर निकाला।

मैं इस परियोजना में प्रकार "युद्ध" की निर्भरता था:

<dependency> 
    <groupId>com.whatever.youlike</groupId> 
    <artifactId>myArtifact</artifactId> 
    <version>1.0.7-SNAPSHOT</version> 
    <type>war</type> 
</dependency> 

जाहिर है (मैं नहीं, मेरे यहाँ गलती इस के बारे में पता था) निर्भरता के इन प्रकार को कॉपी करके classpath में खुद को शामिल होंगे मुख्य WAR/libs फ़ोल्डर में सभी libs, लेकिन यह निर्भरता पेड़/निर्भरता पदानुक्रम में ऐप नहीं दिखाएगा।

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <!-- ... --> 
     <packagingExcludes>WEB-INF/lib/wicket-*-6.18.0.jar</packagingExcludes> 
    </configuration> 
</plugin> 
+1

मान्य कार्यवाही। +1 लेकिन इसमें कुछ सीमाएं हैं। वह दिन जहां डब्ल्यूएआर निर्भरता बदलती है, आपको अभी भी अपने निर्मित युद्ध में दो भेद संस्करणों के साथ डुप्लिकेट जार रखने का जोखिम है। मुझे लगता है कि लंबे समय तक एक पोम रिफैक्टरिंग बेहतर समाधान होगा। – davidxxx

+0

+1, आप सही हैं, यह एक सुरुचिपूर्ण समाधान नहीं है। हम अगली रिलीज के लिए एक ही संस्करण का उपयोग करने के लिए दो परियोजनाओं को संरेखित करेंगे। अभी के लिए, यह त्वरित फिक्स नौकरी करता है। –

+0

एक और स्पष्टीकरण: मैं इसे युद्ध निर्भरता के माध्यम से शामिल कर रहा हूं क्योंकि शामिल परियोजना जेएआर फॉर्म में हमारे भंडारों में मौजूद नहीं है। मुझे केवल एक वर्ग की आवश्यकता है, एक अलग वर्ग साझा करने के लिए एक अलग वर्ग को निकालने के लिए पूरी परियोजना को दोबारा करने के लिए अत्यधिक होगा। –

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