मैं मावेन को एक निर्भरता के नवीनतम संस्करण का उपयोग करने के लिए कैसे कहूं?


788

मावेन में, आश्रितों को आमतौर पर इस तरह स्थापित किया जाता है:

<dependency>
  <groupId>wonderful-inc</groupId>
  <artifactId>dream-library</artifactId>
  <version>1.2.3</version>
</dependency>

अब, यदि आप लगातार रिलीज़ होने वाले पुस्तकालयों के साथ काम कर रहे हैं, तो लगातार <version> टैग को अपडेट करना कुछ हद तक कष्टप्रद हो सकता है। क्या मावेन को हमेशा नवीनतम उपलब्ध संस्करण (रिपॉजिटरी से) का उपयोग करने का कोई तरीका है?


@ मर्टिन मुझे xyz-SNAPSHOT सम्मेलन के बारे में पता है, लेकिन मैं उन पुस्तकालयों के बारे में सोच रहा था जो अंतिम संस्करणों में जारी किए गए हैं रिपॉजिटरी (यानी सपनों की लाइब्रेरी-1.2.3.jar से लेकर ड्रीम-लाइब्रेरी-1.2.4.jar तक) , और इसी तरह)।
एंडर्स सैंडविग

176
मैं वास्तव में इस अभ्यास की अनुशंसा नहीं करता हूं (और न ही वर्जन रेंज का उपयोग करके) बिल्ड रिप्रोड्यूसबिलिटी के लिए। एक अज्ञात कारण के लिए अचानक विफल होने वाला निर्माण मैन्युअल रूप से एक संस्करण संख्या को अपडेट करने की तुलना में अधिक कष्टप्रद है।
पास्कल थिवेंट

12
@PascalThivent यदि आप निरंतर रिलीज़ कर रहे हैं, तो पॉम में रिलीज़ नंबर को मैन्युअल रूप से अपडेट करना एक दर्द है। मैं इसे पाने के लिए scm प्लगइन के साथ संयुक्त संस्करण प्लगइन का उपयोग करता हूं (मेरा उत्तर देखें)।
एडम जेंट

4
@PascalThivent दोनों कष्टप्रद हैं, लेकिन एक अलग तरीके से। मैं अपनी स्थिति पर निर्भर दोनों के बीच चयन करना चाहता हूं और एक का उपयोग करने के लिए मजबूर नहीं होना चाहिए क्योंकि किसी और ने फैसला किया है कि यह बेहतर होगा।
20

जवाबों:


745

ध्यान दें:

यह जवाब मावेन 2 पर ही लागू होता है! उल्लेख किया LATESTऔर RELEASEmetaversions 6 साल पहले Maven 3 में "प्रतिलिपि प्रस्तुत करने योग्य बिल्ड के लिए" गिरा दिया गया है। कृपया इस मावेन 3 आज्ञाकारी समाधान का संदर्भ लें


यदि आप हमेशा नवीनतम संस्करण का उपयोग करना चाहते हैं, तो मावेन के पास दो खोजशब्द हैं जिन्हें आप संस्करण श्रेणियों के विकल्प के रूप में उपयोग कर सकते हैं। आपको इन विकल्पों का उपयोग सावधानी से करना चाहिए क्योंकि अब आप उपयोग किए जा रहे प्लगइन्स / निर्भरता के नियंत्रण में नहीं हैं।

जब आप एक प्लगइन या एक निर्भरता पर निर्भर करते हैं, तो आप LATEST या RELEASE के संस्करण मान का उपयोग कर सकते हैं। नवीनतम एक विशेष विरूपण साक्ष्य के नवीनतम जारी या स्नैपशॉट संस्करण को संदर्भित करता है, जो हाल ही में एक विशेष भंडार में तैनात विरूपण साक्ष्य है। कृपया अंतिम रिपॉजिटरी में गैर-स्नैपशॉट रिलीज़ को संदर्भित करता है। सामान्य तौर पर, यह सॉफ्टवेयर डिजाइन करने के लिए सबसे अच्छा अभ्यास नहीं है जो किसी विरूपण साक्ष्य के गैर-विशिष्ट संस्करण पर निर्भर करता है। यदि आप सॉफ़्टवेयर विकसित कर रहे हैं, तो आप एक सुविधा के रूप में RELEASE या LATEST का उपयोग करना चाह सकते हैं ताकि तृतीय-पक्ष लायब्रेरी के नए रिलीज़ होने पर आपको संस्करण संख्याओं को अपडेट न करना पड़े। जब आप सॉफ़्टवेयर जारी करते हैं, तो आपको हमेशा यह सुनिश्चित करना चाहिए कि आपकी परियोजना आपके निर्माण की संभावना को कम करने के लिए विशिष्ट संस्करणों पर निर्भर करती है या आपके नियंत्रण में नहीं होने वाले सॉफ़्टवेयर रिलीज़ से प्रभावित हो रही है।

देखें Maven पुस्तक के पोम सिंटेक्स अनुभाग अधिक जानकारी के लिए। या डिपेंडेंसी वर्जन रेंज पर इस डॉक को देखें , जहां:

  • एक वर्ग ब्रैकेट ( [& ]) का अर्थ है "बंद" (समावेशी)।
  • एक कोष्ठक ( (& )) का अर्थ है "खुला" (अनन्य)।

यहाँ विभिन्न विकल्पों का उदाहरण दिया गया है। मावेन भंडार में, com.foo:my-foo में निम्नलिखित मेटाडेटा है:

<?xml version="1.0" encoding="UTF-8"?><metadata>
  <groupId>com.foo</groupId>
  <artifactId>my-foo</artifactId>
  <version>2.0.0</version>
  <versioning>
    <release>1.1.1</release>
    <versions>
      <version>1.0</version>
      <version>1.0.1</version>
      <version>1.1</version>
      <version>1.1.1</version>
      <version>2.0.0</version>
    </versions>
    <lastUpdated>20090722140000</lastUpdated>
  </versioning>
</metadata>

यदि उस विरूपण साक्ष्य पर निर्भरता की आवश्यकता होती है, तो आपके पास निम्नलिखित विकल्प हैं (अन्य संस्करण श्रेणियां निश्चित रूप से निर्दिष्ट की जा सकती हैं, बस यहां प्रासंगिक विवरण दिखा रहे हैं):

एक सटीक संस्करण घोषित करें (हमेशा 1.0.1 के लिए हल होगा):

<version>[1.0.1]</version>

एक स्पष्ट संस्करण घोषित करें (हमेशा हमेशा के लिए संकल्प लेंगे जब तक कि कोई टक्कर नहीं होती है, जब मावेन एक मिलान संस्करण का चयन करेगा):

<version>1.0.1</version>

सभी 1.x के लिए एक संस्करण रेंज घोषित करें (वर्तमान में 1.1.1 पर हल होगा):

<version>[1.0.0,2.0.0)</version>

एक ओपन एंडेड वर्जन रेंज घोषित करें (2.0.0 पर हल होगा):

<version>[1.0.0,)</version>

संस्करण को नवीनतम के रूप में घोषित करें (2.0.0 पर हल होगा) (मावेन 3.x से हटा दिया गया)

<version>LATEST</version>

संस्करण को RELEASE के रूप में घोषित करें (1.1.1 पर हल होगा) (maven 3.x से हटाया गया):

<version>RELEASE</version>

ध्यान दें कि डिफ़ॉल्ट रूप से आपकी स्वयं की तैनाती मावेन मेटाडेटा में "नवीनतम" प्रविष्टि को अपडेट करेगी, लेकिन "रिलीज़" प्रविष्टि को अपडेट करने के लिए, आपको मावेन सुपर पीओएम से "रिलीज़-प्रोफाइल" को सक्रिय करने की आवश्यकता है । आप इसे "-Prelease-profile" या "-DformformRelease = true" के साथ कर सकते हैं


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

इसलिए आम तौर पर रिलीज में सटीक संस्करणों को परिभाषित करना एक अच्छा विचार है। जैसा कि टिम का उत्तर बताता है, मावेन-संस्करण-प्लगइन निर्भरता संस्करणों को अद्यतन करने के लिए एक उपयोगी उपकरण है, विशेष रूप से संस्करण: उपयोग-नवीनतम-संस्करण और संस्करण: उपयोग-नवीनतम-रिलीज़ लक्ष्य।


76
हाय धनी! ऐसा प्रतीत होता है कि RAILASE और LATEST संस्करण मार्कर अब Maven 3.x में समर्थित नहीं हैं ।
पास्कल थिवेंट

16
अगर मैं दस्तावेज़ को सही ढंग से समझता हूं तो यह डिप्रेशन सामान्य निर्भरता के बजाय केवल प्लगइन्स पर लागू होता है
मोंड रेमंड

9
@ रीचेलर हे रिच; मैं इस पर थोड़ा समय बिताता इससे पहले कि मुझे लगा कि यह मावेन 3.0 में अब उपलब्ध नहीं है?) क्या आप इस उत्तर को संपादित करने पर विचार करेंगे, इसलिए यह मावेन 3.0 के अभाव को बताते हुए अपडेट के साथ शुरू होता है? बहुत बहुत धन्यवाद!
मिकेल

6
मेरा मानना ​​है कि एक अच्छा संतुलन प्रमुख संस्करण को लॉक करने के लिए होगा लेकिन नवीनतम माइनर (या पैच) संस्करण प्राप्त करें (जो भी आपके द्वारा निर्भर किए गए आर्टिफैक्ट में बग-फिक्स के लिए उपयोग किया जाता है)। वर्तमान सिंटैक्स के साथ यह केवल एक सीमा के साथ संभव प्रतीत होता है जैसे (नोट: कोष्ठक के साथ शुरू होता है और परेंस के साथ समाप्त होता है):[1.1,2.0)
अमल मुस्तफा

2
FWIW ... Maven3 संगतता नोट्स के लिए अद्यतन लिंक: cwiki.apache.org/confluence/display/MAVEN/…
dyodji

383

अब मुझे पता है कि यह विषय पुराना है, लेकिन प्रश्न और ओपी द्वारा दिए गए उत्तर को पढ़कर ऐसा लगता है कि मावेन संस्करण प्लगइन वास्तव में उनके प्रश्न का बेहतर उत्तर हो सकता है:

विशेष रूप से निम्नलिखित लक्ष्य उपयोग के हो सकते हैं:

  • संस्करण: उपयोग-नवीनतम-संस्करण सभी संस्करणों के लिए पोम खोजता है जो एक नया संस्करण रहा है और उन्हें नवीनतम संस्करण के साथ बदल देता है।
  • संस्करण: उपयोग-नवीनतम-रिलीज़ सभी गैर-स्नैपशॉट संस्करणों के लिए पोम की खोज करता है जो एक नया रिलीज़ हुआ है और उन्हें नवीनतम रिलीज़ संस्करण के साथ बदल देता है।
  • संस्करण: अद्यतन-गुण अद्यतन गुण एक परियोजना में परिभाषित किया गया है ताकि वे विशिष्ट निर्भरता के नवीनतम उपलब्ध संस्करण के अनुरूप हों। यह उपयोगी हो सकता है अगर निर्भरता का एक सूट सभी को एक संस्करण में बंद किया जाना चाहिए।

निम्नलिखित अन्य लक्ष्य भी दिए गए हैं:

  • संस्करण: प्रदर्शन-निर्भरता-अपडेट परियोजना की निर्भरता को स्कैन करते हैं और उन निर्भरता की रिपोर्ट तैयार करते हैं जिनके पास नए संस्करण उपलब्ध हैं।
  • संस्करण: प्रदर्शन-प्लगइन-अपडेट परियोजना के प्लगइन्स को स्कैन करते हैं और उन प्लगइन्स की रिपोर्ट तैयार करते हैं जिनके पास नए संस्करण उपलब्ध हैं।
  • संस्करण: अपडेट-पैरेंट किसी प्रोजेक्ट के मूल अनुभाग को अपडेट करता है ताकि यह नवीनतम उपलब्ध संस्करण का संदर्भ दे। उदाहरण के लिए, यदि आप कॉर्पोरेट रूट POM का उपयोग करते हैं, तो यह लक्ष्य मददगार हो सकता है यदि आपको यह सुनिश्चित करने की आवश्यकता है कि आप कॉर्पोरेट रूट POM के नवीनतम संस्करण का उपयोग कर रहे हैं।
  • संस्करण: अपडेट-चाइल्ड-मॉड्यूल किसी प्रोजेक्ट के चाइल्ड मॉड्यूल के मूल खंड को अपडेट करते हैं इसलिए संस्करण वर्तमान प्रोजेक्ट के संस्करण से मेल खाता है। उदाहरण के लिए, यदि आपके पास एक एग्रीगेटर पोम है जो उन परियोजनाओं के लिए भी अभिभावक है जो इसे एकत्र करते हैं और बच्चे और माता-पिता संस्करण सिंक से बाहर निकलते हैं, तो यह मोजो बाल मॉड्यूल के संस्करणों को ठीक करने में मदद कर सकता है। (ध्यान दें कि इस लक्ष्य को चलाने के लिए आपको -N विकल्प के साथ मावेन को आमंत्रित करने की आवश्यकता हो सकती है यदि आपकी परियोजना इतनी बुरी तरह से टूट गई है कि यह संस्करण गलत मिलान के कारण नहीं बन सकता है)।
  • संस्करण: लॉक-स्नैपशॉट सभी -SNAPSHOT संस्करणों के लिए pom को खोजता है और उन्हें उस -SNAPSHOT के वर्तमान टाइमस्टैम्प संस्करण, जैसे -20090327.172306-4 के साथ बदल देता है
  • संस्करण: अनलॉक-स्नैपशॉट सभी टाइमस्टैम्प लॉक किए गए स्नैपशॉट संस्करणों के लिए पोम को खोजता है और उन्हें -NAPSHOT के साथ बदल देता है।
  • संस्करण: रिज़ॉल्यूशन-रेंज संस्करण श्रेणियों का उपयोग कर निर्भरता पाता है और उपयोग किए जा रहे विशिष्ट संस्करण की सीमा को हल करता है।
  • संस्करण: उपयोग-रिलीज़ उन सभी -SNAPSHOT संस्करणों के लिए पोम खोजता है जो जारी किए गए हैं और उन्हें उसी रिलीज़ संस्करण के साथ बदल देता है।
  • संस्करण: उपयोग-अगले-रिलीज़ सभी गैर-स्नैपशॉट संस्करणों के लिए पोम को खोजता है जो एक नया रिलीज़ हुआ है और उन्हें अगले रिलीज़ संस्करण के साथ बदल देता है।
  • संस्करण: उपयोग-अगले-संस्करण उन सभी संस्करणों के लिए पोम को खोजता है जो एक नया संस्करण रहे हैं और उन्हें अगले संस्करण के साथ बदल देता है।
  • संस्करण: प्रतिबद्ध pom.xml.versionsBackup फ़ाइलों को निकालता है। अंतर्निहित "गरीब आदमी की SCM" का एक आधा भाग।
  • संस्करण: वापस pom.xml.versionsBackup फ़ाइलों से pom.xml फ़ाइलों को पुनर्स्थापित करता है। अंतर्निहित "गरीब आदमी की SCM" का एक आधा भाग।

बस सोचा था कि मैं इसे भविष्य के किसी भी संदर्भ के लिए शामिल करूंगा।


10
इस संदर्भ में, "रिलीज़" और "संस्करण" में क्या अंतर है।
बेन नॉलैंड

1
@BenNoland, मेरा मानना ​​है कि इस मामले में अंतर यह है कि अगले संस्करण को रिलीज़ विरूपण साक्ष्य की आवश्यकता नहीं हो सकती है। उदाहरण के लिए, एक आर्टिफिशियल संस्करण दिया गया जिसे 1.0.0-SNAPSHOT, 1.0.0, और 1.0.1-SNAPSHOT, और एक पोम संदर्भ 1.0.0-SNAPSHOT, संस्करण: अगले-संस्करण और संस्करण: अगली-रिलीज़ के लिए 1.0.0 का समाधान होगा , जबकि संस्करण: नवीनतम-संस्करण और संस्करण: नवीनतम-रिलीज़ 1.0.1-SNAPSHOT और 1.0.0 को सम्मानपूर्वक हल करेंगे।
रयान बेस्ले

1
आप इस बहुत अच्छी तालिका में संस्करणों / रिलीज / स्नैपशॉट के बीच कुछ अनिश्चितताओं को हल कर सकते हैं: goo.gl/iDq6PK
Ev0oD

1
सभी संभव और असंबंधित लक्ष्यों को छापना मददगार नहीं है।
MariuszS

2
मुझे लगता है कि संस्करण: उपयोग-नवीनतम-संस्करण ओपी की अधिकांश समस्याओं को हल करते हैं।
एलेक्स आर

172

कृपया इस पृष्ठ (अनुभाग "निर्भरता संस्करण रेंज") पर एक नज़र डालें । आप जो करना चाहते हैं वह कुछ ऐसा है

<version>[1.2.3,)</version>

ये संस्करण श्रेणियाँ Maven2 में कार्यान्वित की जाती हैं।


किसी कारण से इस विकल्प ने मेरे लिए काम नहीं किया, इसने रेंज के अंदर एक संस्करण उठाया लेकिन सबसे नया नहीं।
सोरिन

4
आप यह जानना चाह सकते हैं कि मावेन संस्करण संख्याओं की तुलना कैसे करते हैं - यदि आप एक सख्त पैटर्न के अनुरूप नहीं हैं तो मावेन तार के रूप में तुलना करते हैं और संख्या नहीं।
Thorbjørn रावन एंडरसन

वह पृष्ठ कोडहॉस पर है, और खुद को उन चीजों के रूप में वर्णित करता है जो "मावेन 2.0 के लिए अभी तक लागू नहीं हुई हैं" ... मावेन प्रलेखन स्वयं संस्करण श्रेणियों के बारे में कुछ नहीं कहता है। क्या मैं कुछ भूल रहा हूँ? वर्जन रेंज कब पेश की गई? उन्हें आधिकारिक दस्तावेज में कहां वर्णित किया गया है?
शैनन

1
आप गलत हैं, संस्करण सीमा का मतलब है कि सभी संस्करण 1.2.3 से उच्चतर तक ठीक हैं। यह बिल्कुल नवीनतम संस्करण नहीं है।
MariuszS

@ सोरिन क्या आपने शायद अपनी परियोजना में अन्य निर्भरताएं भी की हैं जो प्रश्न में कलाकृतियों पर निर्भर हैं? mvn dependency:tree -Dverboseयह पता लगाने की कोशिश करें । यह अप्रत्याशित संस्करण की व्याख्या कर सकता है।
यूजीन बेरेसोव्स्की

83

दूसरों के विपरीत मुझे लगता है कि कई कारण हैं कि आप हमेशा नवीनतम संस्करण क्यों चाहते हैं । विशेष रूप से यदि आप निरंतर तैनाती कर रहे हैं (हम कभी-कभी एक दिन में 5 रिलीज पसंद करते हैं) और एक मल्टी-मॉड्यूल प्रोजेक्ट नहीं करना चाहते हैं।

हडसन / जेनकींस हर निर्माण के लिए निम्नलिखित कार्य करता है:

mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true

यह है कि मैं निर्भरता को अद्यतन करने के लिए संस्करण प्लगइन और scm प्लगइन का उपयोग करता हूं और फिर इसे स्रोत नियंत्रण में जांचता हूं। हां, मैंने अपने CI को SCM चेकइन करने दिया (जो आपको मावेन रिलीज प्लगइन के लिए वैसे भी करना है)।

आप केवल इच्छित अपडेट के लिए संस्करण प्लगइन सेटअप करना चाहते हैं:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>versions-maven-plugin</artifactId>
    <version>1.2</version>
    <configuration>
        <includesList>com.snaphop</includesList>
        <generateBackupPoms>false</generateBackupPoms>
        <allowSnapshots>true</allowSnapshots>
    </configuration>
</plugin>

मैं रिलीज़ करने के लिए रिलीज़ प्लगइन का उपयोग करता हूँ जो -SNAPSHOT का ध्यान रखता है और पुष्टि करता है कि -SNAPSHOT (जो महत्वपूर्ण है) का रिलीज़ संस्करण है।

यदि आप ऐसा करते हैं तो मैं आपको सभी स्नैपशॉट बिल्ड के लिए नवीनतम संस्करण और रिलीज़ बिल्ड के लिए नवीनतम रिलीज़ संस्करण प्राप्त करूंगा। आपके बिल्ड भी प्रतिलिपि प्रस्तुत करने योग्य होंगे।

अपडेट करें

मैंने इस वर्कफ़्लो की कुछ बारीकियों को पूछते हुए कुछ टिप्पणियां देखीं। मैं कहूंगा कि हम इस विधि का उपयोग नहीं करते हैं और बड़े कारण है कि मावेन संस्करण प्लगइन छोटी गाड़ी है और सामान्य रूप से स्वाभाविक रूप से त्रुटिपूर्ण है।

यह त्रुटिपूर्ण है क्योंकि संस्करणों को समायोजित करने के लिए संस्करण प्लगइन को चलाने के लिए सभी मौजूदा संस्करणों को सही ढंग से चलाने के लिए पोम के लिए मौजूद होना चाहिए। यह संस्करण प्लगइन कुछ भी के नवीनतम संस्करण के लिए अद्यतन नहीं कर सकता है अगर यह pom में संदर्भित संस्करण नहीं मिल सकता है। यह वास्तव में कष्टप्रद है क्योंकि हम अक्सर डिस्क स्पेस कारणों से पुराने संस्करणों को साफ करते हैं।

वास्तव में आपको संस्करणों को समायोजित करने के लिए मावेन से एक अलग टूल की आवश्यकता होती है (ताकि आप सही तरीके से चलाने के लिए पोम फाइल पर निर्भर न हों)। मैंने नीच भाषा में ऐसा उपकरण लिखा है जो बैश है। स्क्रिप्ट संस्करण प्लगइन जैसे संस्करणों को अपडेट करेगी और पोम को स्रोत नियंत्रण में वापस जांचेगी। यह भी mvn संस्करणों प्लगइन की तुलना में तेजी से 100x की तरह चलता है। दुर्भाग्य से यह सार्वजनिक उपयोग के लिए एक तरीके से नहीं लिखा गया है, लेकिन अगर लोगों की दिलचस्पी है तो मैं इसे ऐसा कर सकता हूं और इसे जिस्ट या जीथब में डाल सकता हूं।

वर्कफ़्लो पर वापस जाने के रूप में कुछ टिप्पणियों के बारे में पूछा कि यह वही है जो हम करते हैं:

  1. हमारे पास अपने स्वयं के जेनकिंस नौकरियों के साथ अपने स्वयं के भंडार में 20 या तो परियोजनाएं हैं
  2. जब हम मावेन रिलीज करते हैं तो प्लगइन का उपयोग किया जाता है। उस के वर्कफ़्लो को प्लग इन के डॉक्यूमेंटेशन में कवर किया गया है। मावेन रिलीज प्लगइन बेकार की तरह (और मैं दयालु हो रहा है) लेकिन यह काम करता है। एक दिन हम इस पद्धति को कुछ और अधिक इष्टतम के साथ बदलने की योजना बनाते हैं।
  3. जब परियोजनाओं में से एक को जेनकींस रिलीज़ हो जाता है, तो एक विशेष काम चलाता है हम अपडेट को सभी संस्करणों की नौकरी कहेंगे (जेनकींस को पता है कि इसकी रिलीज़ एक जटिल तरीके से है क्योंकि मावेन जेनकिंस रिलीज़ प्लगइन बहुत भद्दा है)।
  4. अद्यतन सभी संस्करणों की नौकरी सभी 20 परियोजनाओं के बारे में जानती है। यह वास्तव में एग्रीगेटर पोम है जो निर्भरता क्रम में मॉड्यूल अनुभाग में सभी परियोजनाओं के साथ विशिष्ट है। जेनकिन्स हमारी जादू ग्रूवी / बैश फू को चलाता है जो सभी परियोजनाओं को नवीनतम संस्करणों को अपडेट करेगा और फिर पॉम (फिर से मॉड्यूल अनुभाग पर आधारित निर्भरता क्रम में किया गया) को चेक करेगा।
  5. प्रत्येक परियोजना के लिए अगर पोम बदल गया है (कुछ निर्भरता में एक संस्करण परिवर्तन के कारण) तो इसमें जाँच की जाती है और फिर हम तुरंत उस परियोजना के लिए इसी काम को चलाने के लिए जेनकींस को पिंग करते हैं (यह बिल्ड निर्भरता क्रम को संरक्षित करने के लिए है अन्यथा आप दया पर हैं SCM पोल अनुसूचक के)।

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

अब आप सोच सकते हैं कि उपरोक्त सूचीबद्ध समस्याओं के कारण मावेन चूसते हैं लेकिन यह वास्तव में एक बिल्ड टूल के साथ काफी मुश्किल होगा, जिसमें विस्तार योग्य सिंटैक्स (उर्फ एक्सएमएल) को पार्स करने के लिए घोषणात्मक आसान नहीं है ।

वास्तव में हम हिंट बैश / ग्रूवी स्क्रिप्ट (उदाहरण के लिए इस संस्करण को अपडेट नहीं करते) में मदद करने के लिए नामस्थानों के माध्यम से कस्टम XML विशेषताओं को जोड़ते हैं।


5
आपके उत्तर में एक प्रेरणा (निरंतर तैनाती) को शामिल करने के लिए धन्यवाद।
डेविड जे। लिस्ज़ेवस्की

10
मुझे लगता है कि यहाँ महत्वपूर्ण बिंदु यह है कि बनाता है इस विधि के साथ प्रतिलिपि प्रस्तुत करने योग्य हैं, जबकि, जब संस्करण रेंज या -LATEST का उपयोग कर रहे हैं, तो वे नहीं हैं!
marc.guenther

मैं एक बाहरी उपकरण का उपयोग करके समाधान को दूसरा बनाना चाहूंगा ताकि निर्माण से पहले प्रोजेक्ट पोम में बदलाव हो सके। हम इस दृष्टिकोण का भी उपयोग कर रहे हैं क्योंकि संस्करण-रेंज-प्लगइन को स्वाभाविक रूप से खाते की तारीखों और न केवल संस्करणों के लिए उदाहरण के लिए बग किया गया है।
डैनियल हज़डुक

37

निर्भरता सिंटैक्स निर्भरता संस्करण आवश्यकता विशिष्टता प्रलेखन पर स्थित है । यहाँ यह पूर्णता के लिए है:

निर्भरता versionतत्व तत्व की आवश्यकताओं को परिभाषित करता है, जिसका उपयोग प्रभावी निर्भरता संस्करण की गणना के लिए किया जाता है। संस्करण आवश्यकताओं में निम्नलिखित सिंटैक्स है:

  • 1.01.0 पर "सॉफ्ट" आवश्यकता (सिर्फ एक सिफारिश, अगर यह निर्भरता के लिए अन्य सभी श्रेणियों से मेल खाती है)
  • [1.0]: 1.0 पर "हार्ड" आवश्यकता
  • (,1.0]: x <= 1.0
  • [1.2,1.3]: 1.2 <= x <= 1.3
  • [1.0,2.0): 1.0 <= x <2.0
  • [1.5,): x> = 1.5
  • (,1.0],[1.2,): x <= 1.0 या x> = 1.2; कई सेट अल्पविराम से अलग किए गए हैं
  • (,1.1),(1.1,): यह 1.1 को शामिल करता है (उदाहरण के लिए यदि यह इस पुस्तकालय के साथ संयोजन में काम नहीं करने के लिए जाना जाता है)

आपके मामले में, आप कुछ ऐसा कर सकते हैं <version>[1.2.3,)</version>


15

क्या आप संभवतः विकास संस्करणों पर निर्भर करते हैं जो स्पष्ट रूप से विकास के दौरान बहुत कुछ बदलते हैं?

विकास रिलीज के संस्करण को बढ़ाने के बजाय, आप बस एक स्नैपशॉट संस्करण का उपयोग कर सकते हैं जिसे आप आवश्यक होने पर अधिलेखित कर देते हैं, जिसका अर्थ है कि आपको हर मामूली बदलाव पर संस्करण टैग को बदलना नहीं होगा। 1.0-SNAPSHOT जैसा कुछ ...

लेकिन शायद आप कुछ और हासिल करने की कोशिश कर रहे हैं;)


7

जो कभी नवीनतम का उपयोग कर रहा है, कृपया सुनिश्चित करें कि आपके पास -U है अन्यथा नवीनतम स्नैपशॉट खींचा नहीं जाएगा।

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories

यहां तक ​​कि -U का उपयोग करते हुएCouldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST
रॉबर्ट

7

जब तक यह प्रश्न सामने आया था तब तक मावेन में संस्करण रेंज के साथ कुछ किंक थे, लेकिन इनका समाधान मक्केन के नए संस्करणों में किया गया है। यह आलेख बहुत अच्छी तरह से बताता है कि संस्करण कैसे काम करता है और सर्वोत्तम अभ्यास बेहतर तरीके से समझते हैं कि मावेन संस्करणों को कैसे समझता है: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVENV855


2
जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
कार्ल रिक्टर

6

सच यह है कि 3.x में यह अभी भी काम करता है, आश्चर्यजनक रूप से परियोजनाएं बनाता है और तैनात करता है। लेकिन एलएटीई में समस्याएँ उत्पन्न करने वाले लेटेस्ट / रिजल्ट कीवर्ड और सभी जगह ग्रहण, एएलएसओ प्रोजेक्ट्स निर्भरता पर निर्भर करते हैं जो लेटेस्ट / रिलेस्ट के माध्यम से तैनात होते हैं जो संस्करण को पहचानने में विफल होते हैं।

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

यदि आप कर सकते हैं तो निष्कर्ष संस्करण-मावेन-प्लगइन का उपयोग करें ।


5

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

एक वर्कअराउंड संस्करण-मावेन-प्लगइन का उपयोग करना होगा । उदाहरण के लिए, आप एक संपत्ति की घोषणा कर सकते हैं:

<properties>
    <myname.version>1.1.1</myname.version>
</properties>

और अपनी pom फ़ाइल में संस्करण-मावेन-प्लगइन जोड़ें:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <properties>
                    <property>
                        <name>myname.version</name>
                        <dependencies>
                            <dependency>
                                <groupId>group-id</groupId>
                                <artifactId>artifact-id</artifactId>
                                <version>latest</version>
                            </dependency>
                        </dependencies>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
</build>

फिर, निर्भरता को अद्यतन करने के लिए, आपको लक्ष्यों को निष्पादित करना होगा:

mvn versions:update-properties validate

यदि 1.1.1 से नया संस्करण है, तो यह आपको बताएगा:

[INFO] Updated ${myname.version} from 1.1.1 to 1.3.2

3

यदि आप चाहते हैं कि मावेन को एक निर्भरता के नवीनतम संस्करण का उपयोग करना चाहिए, तो आप संस्करण मावेन प्लगइन का उपयोग कर सकते हैं और इस प्लगइन का उपयोग कैसे करें, टिम ने पहले ही एक अच्छा जवाब दिया है, उसके उत्तर का पालन करें ।

लेकिन एक डेवलपर के रूप में, मैं इस प्रकार की प्रथाओं की सिफारिश नहीं करूंगा। क्यों?

प्रश्न की टिप्पणी में पास्कल थिवेंट द्वारा पहले से ही क्यों दिया गया है , इसका उत्तर

मैं वास्तव में इस अभ्यास की अनुशंसा नहीं करता हूं (और न ही वर्जन रेंज का उपयोग करके) बिल्ड रिपुसिबिलिटी के लिए। एक अज्ञात कारण के लिए अचानक विफल होने वाला निर्माण मैन्युअल रूप से एक संस्करण संख्या को अपडेट करने की तुलना में अधिक कष्टप्रद है।

मैं इस प्रकार के अभ्यास की सिफारिश करूंगा:

<properties>
    <spring.version>3.1.2.RELEASE</spring.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

</dependencies>

इसे बनाए रखना आसान है और डिबग करना आसान है। आप कुछ ही समय में अपने POM को अपडेट कर सकते हैं।


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

1

मावेन 3.5.4 में मेरा समाधान, ग्रहण में नेक्सस का उपयोग करें:

<dependency>
    <groupId>yilin.sheng</groupId>
    <artifactId>webspherecore</artifactId>
    <version>LATEST</version> 
</dependency>

फिर ग्रहण में: atl + F5और चुनेंforce update of snapshots/release

इससे मेरा काम बनता है।


विभिन्न पदों में ऊपर बताए गए कारणों के लिए हालांकि कमांड लाइन पर काम नहीं करेगा। हम में से कई को स्वचालित बिल्ड के अनुरूप होना पड़ता है और इसलिए हमारे POMs को कमांड लाइन पर काम करना पड़ता है, न कि केवल ग्रहण में।
bigbadmouse

मैं मावेन 3.5.4 का उपयोग कर रहा हूं और 'लेटेस्ट' का उपयोग करते समय यह मिला: या तो लेटेस्ट या रीलेस्ट (दोनों को अपग्रेड किया जा रहा है) @ लाइन 154, कॉलम 13
लियोनार्डो लियोनार्डो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.