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




maven dependencies (8)

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

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

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

निम्नलिखित अन्य लक्ष्यों को भी प्रदान किया जाता है:

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

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

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

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

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


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

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

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

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

<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

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

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

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


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


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

मैं जो करता हूं वह हर बिल्डिंग के लिए हडसन / जेनकींस निम्नलिखित करता है:

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

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

आप जो भी चाहते हैं उसे अपडेट करने के लिए आप संस्करण प्लगइन सेट अप करना चाहेंगे:

        <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>

मैं रिलीज करने के लिए रिलीज प्लगइन का उपयोग करता हूं जो एसएनएपीएसएचओटी का ख्याल रखता है और मान्य करता है कि स्नैपशॉट का एक रिलीज़ संस्करण है (जो महत्वपूर्ण है)।

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

अद्यतन करें

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

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

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

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

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

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

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

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


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

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

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

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


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

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

तो निष्कर्ष maven-versions-plugin का उपयोग कर सकते हैं यदि आप कर सकते हैं।


ध्यान दें:

यह उत्तर केवल मेवेन 2 पर लागू होता है! उल्लेखनीय LATEST और RELEASE मेटावर्जन को 6 साल पहले, "पुनरुत्पादित निर्माण के लिए" मेवेन 3 में गिरा दिया गया है। कृपया इस मेवेन 3 अनुपालन समाधान का संदर्भ लें

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

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

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

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

यहां विभिन्न विकल्पों को चित्रित करने का एक उदाहरण दिया गया है। मेवेन रिपोजिटरी में, 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>

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

<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>

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

<version>RELEASE</version>

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

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

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






maven-metadata