एक मल्टी-मॉड्यूल मावेन प्रोजेक्ट में मॉड्यूल के संस्करण संख्याओं को अपडेट करना


324

मेरे पास एक मल्टी-मॉड्यूल मावेन प्रोजेक्ट है। हम इन सभी मॉड्यूल्स को एक साथ लाने का इरादा रखते हैं। लेकिन अब मैं नीचे दिए गए प्रत्येक मॉड्यूल pom.xml में हार्ड-कोडिंग संस्करण को समाप्त कर रहा हूं

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

और मुख्य मूल मॉड्यूल में नीचे विन्यास है

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>

1
आपका प्रश्न गलत है और उन लोगों को भ्रमित करता है जिनके पास सच्चे मल्टी-मॉड्यूल ("कुल") पोम हैं। आपके उदाहरण और उत्तरों से ऐसा प्रतीत होता है कि आप वास्तव में एक मूल POM के बारे में बात कर रहे हैं, न कि एक बहु-मॉड्यूल, कुल POM। Maven.apache.org/pom.html#Aggregation देखें ।
अटारी विल्सन

जवाबों:


630

संस्करणों-मावेन प्लगइनversions:set से उपयोग करें :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

यह बहु-मॉड्यूल परियोजना में सभी पोम संस्करण, मूल संस्करण और निर्भरता संस्करणों को समायोजित करेगा।

यदि आपने कोई गलती की है, तो करें

mvn versions:revert

बाद में, या

mvn versions:commit

यदि आप परिणामों से खुश हैं।


नोट: यह समाधान मानता है कि सभी मॉड्यूल मूल पोम का उपयोग मूल पोम के रूप में भी करते हैं, एक ऐसा परिदृश्य जिसे इस उत्तर के समय मानक माना जाता था। यदि ऐसा नहीं है, तो गैरेट विल्सन के जवाब के लिए जाएं


5
यह बहुत अच्छा होता अगर कोई ऐसा समाधान होता जिसे आपको वास्तव में प्रत्येक मॉड्यूल को बदलने की आवश्यकता नहीं होती। एकमात्र विकल्प जो मैं सोच सकता हूं, वह हमेशा पेरेंट-पोम के लिए स्नैपशॉट संस्करण का उपयोग करना है।
अमानीका

54
इसके अलावा, versions:setएक के -DgenerateBackupPoms=falseरूप में निर्दिष्ट कर सकते हैं , डिफ़ॉल्ट रूप से यह प्लगइन मूल पोम फ़ाइलों को वापस करता है।
मक्सिम सोरोकिन

20
यह बिंदु है versions:commit: "पोम के प्रारंभिक बैकअप को हटाता है, जिससे परिवर्तनों को स्वीकार किया जाता है।"
माइकल लाफार्ज लीग

2
एक नया प्लगइन इस प्रश्न में वर्णित समस्या को अलग ढंग से हल करता है: mojo.codehaus.org/flatten-maven-plugin/examples/…
Stephan

1
@MichaelLaffargue mvan संस्करण: प्रतिबद्ध पिछले pom.xml से उत्पन्न बैकअप फ़ाइलों को निकालने के लिए लगता है
Cris Rockwell

58

दिया गया उत्तर मानता है कि प्रश्न में परियोजना मॉड्यूल एकत्रीकरण के अलावा परियोजना विरासत का उपयोग करती है। वास्तव में वे विशिष्ट अवधारणाएँ हैं:

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation

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

बहुत पढ़ने और प्रयोग के बाद, यह पता चलता है कि केवल एग्रीगेटर POM ही नहीं, बल्कि सभी एग्रीगेटेड मॉड्यूल को भी अपडेट करने के लिए वर्जन मावेन प्लगइन का उपयोग करने का एक तरीका है ; यह processAllModulesविकल्प है। निम्नलिखित कमांड को एग्रीगेटर प्रोजेक्ट की निर्देशिका में किया जाना चाहिए:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules

संस्करण मावेन प्लगइन न केवल सभी निहित मॉड्यूल के संस्करणों को अपडेट करेगा, यह इंटर-मॉड्यूल निर्भरता को भी अपडेट करेगा !!!! यह एक बहुत बड़ी जीत है और इससे समय की बचत होगी और सभी प्रकार की समस्याओं से बचाव होगा।

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

mvn versions:commit -DprocessAllModules

आप बैकअप POMS के साथ पूरी तरह से दूर करने और एक कमांड में सब कुछ करने का निर्णय ले सकते हैं:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false

हम बिल्ड-हेल्पर प्लगइन की तरह अगले संस्करण को कैसे स्वचालित करते हैं?
खो गया

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

1
गुप्त मेक-इट-वर्क स्विच मिला: पैरेंट पोम और मॉड्यूल का शुरुआती संस्करण एक ही होना चाहिए! मेरे माता-पिता पोम "1-SNAPSHOT" से शुरू कर रहे थे और मॉड्यूल में "1.0.0-SNAPSHOT" था। :)
SiKing

1
एक एग्रीगेटर प्रोजेक्ट के साथ, एग्रीगेटर का संस्करण और सबमॉड्यूल्स के संस्करणों का एक समान होना आवश्यक नहीं है। (उदा। आपका एग्रीगेटर पोम केवल शायद ही कभी बदल सकता है और किसी विशेष संस्करण में रह सकता है, जबकि अलग-अलग सबमॉड्यूल्स की अपनी रिलीज़ साइकिल हो सकती है)। versions:setप्लगइन को निर्दिष्ट करने के लिए मुख्य संपत्ति mojohaus.org/versions-maven-plugin/set-mojo.html-DoldVersion='*' पर है , यह स्पष्ट रूप से कहता है कि एग्रीगेटर प्रोजेक्ट को संसाधित करते समय इस संपत्ति को निर्दिष्ट किया जाना चाहिए।
मैथ्यू वाइज

2
-DprocessAllModulesवास्तव में किन परिस्थितियों में काम करता है ? यह मेरे लिए काम नहीं करता है।
एलेक्स आर

24

यदि आप इस प्रक्रिया को पूरी तरह से स्वचालित करना चाहते हैं (यानी आप मौजूदा संस्करण संख्या क्या है, यह जाने बिना संस्करण संख्या को बढ़ाना चाहते हैं, तो आप ऐसा कर सकते हैं:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit

3
धन्यवाद, @Crummy, आप मेरा दिन बचाया है
Maksim Kostromin


या आप उपयोग कर सकते हैं-DoldVersion='*'
मैथ्यू वाइज

23

आप मावेन रिलीज़ प्लगइन की रिलीज़: अद्यतन-संस्करण लक्ष्य देखना चाह सकते हैं । यह माता-पिता के संस्करण के साथ-साथ इसके तहत सभी मॉड्यूल को अपडेट करेगा।


अद्यतन: कृपया ध्यान दें कि ऊपर रिलीज़ प्लगइन है। यदि आप जारी नहीं कर रहे हैं, तो आप उपयोग करना चाह सकते हैंversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

1
mvn संस्करण: सेट मॉड्यूल को प्रभावित नहीं करता है।
9ilsdx 9rvj 0lo


ठीक है यह तब होता है जब रिएक्टर बिल्ड एक ही समय में होता है। यह भ्रामक है जब संरचना अन्यथा दिखती है ...
9ilsdx 9rvj 0lo

mvn release:update-versions -DautoVersionSubmodulesमेरे लिए ठीक काम किया, भले ही मैं रिलीज़ नहीं कर रहा हूँ :-)
msa 15

11

मैं आपको मल्टी-मॉड्यूल (रिएक्टर) बिल्ड के बारे में मावेन बुक पढ़ने के लिए प्रोत्साहित करता हूं ।

मैं विशेष रूप से निम्नलिखित में मतलब था:

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

में बदला जाना चाहिए। यहां केवल परिभाषित संस्करण के बारे में ध्यान रखें कि यह मूल भाग में परिभाषित नहीं है।

<modelVersion>4.0.0</modelVersion>

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>

यह एक बेहतर कड़ी है


10
और क्या विशेष रूप से देखने के लिए?
थोरबजोरन रावन एंडरसन 15

2
pom.xmlफ़ाइलों के लिए उचित स्वरूपण लाने के लिए +1 , लेकिन मैं मानता हूं (@ ThorbjørnRavnAndersen के साथ) कि इस जानकारी के लिए पूरी पुस्तक पढ़ना ओवरकिल है। : पी
प्रियादु नीमरे २ '

7
दुर्भाग्य से माता-पिता से संस्करण की जानकारी प्राप्त करना परियोजना में सभी pom फ़ाइलों को संशोधित करने का बोझ नहीं हटाता है - क्योंकि वे सभी संस्करण संख्या के साथ जनक का संदर्भ देते हैं ।
स्टीवन आसानी से इस्तेमाल होने वाले

1
आप संस्करण-मावेन-प्लगइन का उपयोग कर सकते हैं जो इस सभी सामान को संभालता है या आप मावेन-रिलीज़-प्लगइन का उपयोग कर सकते हैं और इसलिए आपको इसे मैन्युअल रूप से संभालने की आवश्यकता नहीं है ...
khmarbaise

5

versions:update-child-modulesलगता है कि आप क्या देख रहे हैं। आप संस्करण कर सकते हैं: जैसा कि उल्लेख किया गया है, लेकिन मूल संस्करण संख्याओं को अपडेट करने के लिए यह एक हल्के वजन वाला तरीका है। बाल मॉड्यूल के लिए, यह मेरी राय है कि आपको <version>परिभाषाओं को हटा देना चाहिए , क्योंकि वे मूल मॉड्यूल के संस्करण संख्या को प्राप्त करेंगे।


3

सबसे अच्छा तरीका है, चूंकि आप अपने मॉड्यूल को एक साथ बंडल करने का इरादा रखते हैं, आप <dependencyManagement>टैग के pom.xmlतहत बाहरी सबसे (मूल मॉड्यूल) में टैग निर्दिष्ट कर सकते हैं <project>। यह संस्करण और समूह नाम को नियंत्रित करता है। आपके व्यक्तिगत मॉड्यूल में, आपको बस <artifactId>अपने में टैग निर्दिष्ट करने की आवश्यकता है pom.xml। यह पैरेंट फाइल से वर्जन लेगा।


मुझे pom.xml पर टैग निर्भरता प्रबंधन नहीं मिल रहा है । क्या आप कुछ और सोच रहे हैं ?
आर्टुरोटेना

0

सबसे आसान तरीका है कि हर pom.xml में संस्करण को मनमाने ढंग से संस्करण में बदला जाए। फिर उस मॉड्यूल के सही संस्करण का उपयोग करने के लिए निर्भरता प्रबंधन की जाँच करें! उदाहरण के लिए, यदि आप एक टो मॉड्यूल प्रोजेक्ट के लिए वर्जन बढ़ाना चाहते हैं तो यू को फ्लो करना पसंद करना चाहिए:

बच्चे मॉड्यूल में:

    <parent>
       <artifactId>A-application</artifactId>
       <groupId>com.A</groupId>
       <version>new-version</version>
    </parent>

और मूल मॉड्यूल में:

<groupId>com.A</groupId>
<artifactId>A-application</artifactId>
<version>new-version</version>

0

सबमोडुल्स पर मुख्य pom.xml और मूल संस्करण अपडेट करने के लिए:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.