2015-07-31 8 views
16

मैंने सोचा कि मैवेन निर्भरता का आदेश इससे पहले कोई फर्क नहीं पड़ता और इसे इसके समर्थक के रूप में मानता है।मैवेन निर्भरताओं का आदेश क्यों मायने रखता है?

<dependencies> 

    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet</artifactId> 
     <version>2.19</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>4.1.7.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.ext</groupId> 
     <artifactId>jersey-spring3</artifactId> 
     <version>2.19</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-moxy</artifactId> 
     <version>2.19</version> 
    </dependency> 

</dependencies> 

यह अच्छी तरह से काम करता है, और आज मैं नीचे करने के लिए कदम वसंत निर्भरता करना चाहते हैं ताकि उन जर्सी संबंधित एक साथ किया जा सकता है: और यह मेरे पुराने pom.xml की निर्भरता है। हालांकि उसके बाद मैं अब यह काम कर सकते हैं, मेरे जेट्टी की शिकायत:

[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run (default-cli) on project mtest: Execution default-cli of goal org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run failed: A required class was missing while executing org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run: org/apache/commons/logging/LogFactory 

यह वास्तव में भ्रामक है, तो मैं चिंता करने के लिए क्या आदेश निर्भरता के बारे में? मैं सही क्रम कैसे जानूं?

+0

सीधे आपके प्रश्न का उत्तर नहीं दे सकता है, लेकिन मैं आमतौर पर बस [कॉमन्स-लॉगिंग घोषित करता हूं] (https://github.com/jersey/jersey/blob/master/examples/helloworld-spring-webapp/pom.xml# L66)। जांचें कि क्या आपको अभी भी –

+0

@peeskillet शामिल करने के बाद समस्या है, इसके बाद, मेरी जेटी सफलतापूर्वक लॉन्च हुई लेकिन मेरी सेवाएं नहीं चल सकतीं। – Elderry

उत्तर

34

निर्भरता क्योंकि कैसे Maven सकर्मक निर्भरता को हल करता है, संस्करण 2.0.9 के साथ शुरू की फर्क पड़ता है के आदेश। documentation से अंश:

(...) इस निर्धारित करता है निर्भरता का कौन सा संस्करण जब एक विरूपण साक्ष्य के कई संस्करण सामना होता है इस्तेमाल किया जाएगा। (...) आप हमेशा अपने प्रोजेक्ट के पीओएम में इसे स्पष्ट रूप से घोषित करके एक संस्करण की गारंटी दे सकते हैं। (...) मेवेन 2.0.9 के बाद से यह घोषणा में आदेश है कि पहली घोषणा जीतती है।

+2

मुझे यकीन नहीं है कि यह जवाब क्यों कम किया गया था।यह जवाब देता है - कम से कम भाग में - घोषणा का आदेश क्यों मायने रखता है। –

+4

@ केलीकर्ल मैं [डाउनवोट प्रतिशोध] का शिकार था (http://stackoverflow.com/a/31944564/1240557)। आपके +1 के लिए धन्यवाद। – kryger

4

अन्य जवाब (जो कहा गया है कि घोषणा के क्रम सकर्मक निर्भरता के लिए Maven की निर्भरता मध्यस्थता को प्रभावित करता है), कुछ उपकरण हैं आप उपयोग कर सकते हैं उनका विस्तार करने के लिए:

  • mvn dependency:tree [-Dscope=[runtime|test]] आपको बताएंगे कि क्या इच्छा निर्भरता चयनित दायरे के लिए उपलब्ध हो। See here for details
  • mvn dependency:build-classpath आपको आदेश देता है कि आपकी कक्षा में कौन सी निर्भरताएं उपलब्ध हैं (यदि दो या दो से अधिक क्लासपाथ प्रविष्टियों में एक ही कक्षा है, पहले की जीत होती है)। See here for details

मैं अपनी स्थिति के बारे में ज्यादा पता नहीं है, लेकिन अक्सर यह मामला है कि आप संकलन/कार्यावधि में 1 या अधिक जार के गलत संस्करण के साथ हवा है। Declaring your own version of the library in question or locking down the version<dependencyManagement> के साथ विकल्प यहां हैं।

अब अपने अन्य प्रश्न का उत्तर देने के लिए - निर्भर करता है कि निर्भरता घोषित करते समय सही आदेश क्या है?

मेरे सुझाव - सही घोषणा आदेश एक है कि आप, निर्भरता आप चाहते हैं के संस्करणों हो जाता है कि आप उन्हें में चाहते हैं क्रम में है। अपनी निर्भरताओं की जांच के लिए ऊपर दिए गए टूल का उपयोग करें, और यदि आवश्यक हो तो घोषित आदेश को ट्विक करें।

ध्यान दें कि अधिकांश जारों में विचित्र रूप से नामित कक्षाएं होती हैं, इसलिए सटीक क्रम जिसमें आपके क्लासपाथ पर जार दिखाई देते हैं, आमतौर पर यह महत्वपूर्ण नहीं होता है। मैंने देखा है कि एकमात्र अपवाद some jars in SLF4J है जो जानबूझकर अन्य लॉगर पुस्तकालयों से कक्षाओं को छायांकित करता है जिसका उद्देश्य प्रतिस्थापित करना है।

+0

अच्छा जवाब, और लिंक के लिए धन्यवाद – slugmandrew

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