मावेन परियोजना संस्करण विरासत - क्या मुझे मूल संस्करण निर्दिष्ट करना है?


188

मेरे पास दो प्रोजेक्ट हैं: पैरेंट प्रोजेक्ट: A, सब प्रोजेक्ट: B

ए / pom.xml:

<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>pom</packaging>

और बी / pom.xml में, मेरे पास है:

    <parent>
        <groupId>com.dummy.bla</groupId>
        <artifactId>parent</artifactId>
        <version>0.1-SNAPSHOT</version>     
    </parent>

    <groupId>com.dummy.bla.sub</groupId>
    <artifactId>kid</artifactId>

मैं चाहता हूं कि बी को माता-पिता से संस्करण विरासत में मिले, इसलिए मेरे मामले में एकमात्र जगह मुझे लगाने की आवश्यकता 0.1-SNAPSHOTहै A/pom.xml। लेकिन अगर मैं मूल अनुभाग के तहत <version>0.1-SNAPSHOT</version>से हटा देता हूं B/pom.xml, तो मावेन माता-पिता के लिए लापता संस्करण के बारे में शिकायत करता है।

क्या कोई ऐसा तरीका है जो मैं सिर्फ उपयोग कर सकता हूं ${project.version}या कुछ ऐसा कर सकता हूं जिससे 01.-SNAPSHOTदोनों में कोई परेशानी न हो ?


4
आपको इसके लिए मावेन 3.1 का इंतजार करना होगा, मुझे डर है।
धारणा



1
उपरोक्त लिंक स्थानांतरित हो गया है। अंतिम स्थिति "बंद / नॉट
jira

जवाबों:


86

EDIT: मावेन 3.5.0 के बाद से ${revision}प्लेसहोल्डर का उपयोग करने के लिए एक अच्छा समाधान है । देखें FrVaBe के जवाब जानकारी के लिए। पिछले मैवेन संस्करणों के लिए नीचे मेरा मूल उत्तर देखें।


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

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


3
Nowadys आप इसके लिए ${revision}प्लेसहोल्डर का उपयोग कर सकते हैं । मेरा जवाब देखिए ;-)
FrVaBe

2
यह अब पुराना हो गया है - @ FrVaBe का उत्तर यहाँ देखें: stackoverflow.com/a/51969067/514483
17

@FrVaBe क्या होगा अगर हमने अलग-अलग संस्करणों के साथ माता-पिता को नेस्ट किया है? हम वहां एक $ {संशोधन} संपत्ति का उपयोग नहीं कर सकते हैं, यह पर्याप्त नहीं है।
हलील

@halil सवाल दो कलाकृतियों में एक ही संस्करण होने के लक्ष्य के साथ एक माता-पिता से एक संस्करण विरासत में मिला है। यदि आपके पास अलग-अलग संस्करणों के साथ अलग-अलग माता-पिता हैं (एक विरासत पदानुक्रम में) तो आप शायद उन सभी को एक ही संस्करण नहीं बनाएंगे। इसलिए मैं पूरी तरह से टिप्पणी को नहीं समझता हूं।
FrVaBe

86

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

जनक पोम

<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>${global.version}</version>
<packaging>pom</packaging>

<properties>
   <!-- Unique entry point for version number management --> 
   <global.version>0.1-SNAPSHOT</global.version>
</properties>

बाल पोम

<parent>
   <groupId>com.dummy.bla</groupId>
   <artifactId>parent</artifactId>
   <version>${global.version}</version>
   <relativePath>..</relativePath>    
</parent>

<groupId>com.dummy.bla.sub</groupId>
<artifactId>kid</artifactId>

मैंने अपनी परियोजना में से एक के लिए थोड़ी देर के लिए उस चाल का उपयोग किया, कोई विशेष समस्या नहीं है, इस तथ्य को छोड़कर कि निर्माण की शुरुआत में मावेन बहुत सारी चेतावनी देता है, जो बहुत सुरुचिपूर्ण नहीं है।

संपादित करें

लगता है कि मावेन 3.0.4 अब इस तरह के विन्यास की अनुमति नहीं देता है।


2
हाँ, मुझे डर है कि मावेन उस तरह से काम करने के लिए डिज़ाइन नहीं किया गया है, बेहतर बस उप pom.xml में संस्करण डालने के साथ छड़ी। मावेन रिलीज प्लगइन वास्तव में वैसे भी संस्करणों के बारे में परवाह नहीं करता है।
शेंजी

7
3.0.5 के लिए ठीक काम करता है। हालांकि आपको बहुत ऊपर <गुण> डालना चाहिए।
Ses

7
यह 3.2.3 में काम करता है। <गुण> का स्थान मायने नहीं रखता। हालांकि आपको चेतावनी मिल जाएगी:'version' contains an expression but should be a constant.
kapex

4
कृपया, इससे सावधान रहें। जब आपकी परियोजना किसी अन्य परियोजना द्वारा संदर्भित की जा रही है तो यह काम नहीं करेगा। संपत्ति का समाधान नहीं किया जाएगा और इसका शाब्दिक इलाज किया जाएगा (यानी $ {my.version})। यह निर्भरता का समाधान करते समय विफलता का कारण होगा।
स्पेकड्राम

2
मैं भी काफी समय से इसका उपयोग कर रहा हूं और यह एकल मल्टी मॉड्यूल प्रोजेक्ट के लिए ठीक (वर्तमान में maven 3.3.9 के साथ) काम करता है। हालाँकि जैसे ही आपका प्रोजेक्ट किसी अन्य प्रोजेक्ट की निर्भरता बन जाता है, चीजों को वास्तविक रूप से मुश्किल हो जाता है। मैं वास्तव में नीचे दिए गए सुझाव को अपनाने का सुझाव देता हूं।
सरल

80

संस्करणों को अपडेट करने का सबसे आसान तरीका IMO:

$ mvn versions:set -DgenerateBackupPoms=false

(अपने मूल / मूल pom फ़ोल्डर में ऐसा करें)।

आपके POMs को पार्स किया जाता है और आपसे पूछा जाता है कि कौन सा संस्करण सेट करना है।


17
आप इसे अंतःक्रियात्मक रूप से दर्ज करने से बचने के लिए -DnewVersion = {versionToBeUpdated} भी जोड़ सकते हैं।
मुकेश

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

हाँ! यह उत्तर है। 🙌
अज़ीज़ा

यदि बच्चे और माता-पिता पोम संस्करण शुरू में अलग-अलग हैं, तो पहले उन्हें मैच करने के लिए अपडेट करें, mvn versions:update-child-modules अन्यथा सभी चाइल्ड मॉड्यूल पोम संस्करण को छोड़ दिया जाएगा।
गौतम ताडीगुप्पुला

75

मावेन 3.5.0 के बाद से आप उसके लिए ${revision}प्लेसहोल्डर का उपयोग कर सकते हैं । उपयोग यहां प्रलेखित है: मावेन सीआई फ्रेंडली संस्करण

संक्षेप में माता-पिता पोम इस तरह दिखता है (अपाचे प्रलेखन से उद्धृत):

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
  <modules>
    <module>child1</module>
    ..
  </modules>
</project>

और बच्चा इस तरह पोम करता है

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.maven.ci</groupId>
    <artifactId>ci-parent</artifactId>
    <version>${revision}</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-child</artifactId>
   ...
</project>

तुम भी करने के लिए है का उपयोग समतल Maven प्लगइन समर्पित संस्करण संख्या तैनाती के लिए शामिल साथ पोम दस्तावेजों उत्पन्न करने के लिए। जुड़े हुए दस्तावेज में HowTo का दस्तावेजीकरण किया जाता है।

इसके अलावा @khmarbaise ने इस फीचर के बारे में एक अच्छी ब्लॉब पोस्ट लिखी: मावेन: पोम फाइल्स विदाउट अ वर्जन?


मैंने अपनी परियोजना को आप की तरह कॉन्फ़िगर किया है, लेकिन "फ्लैटन मावेन प्लगिन" के बिना और यह उम्मीद के मुताबिक काम करता है, क्या यह संभव है? इसके अलावा मुझे 3.2.1 मावेन के साथ एक त्रुटि मिली, लेकिन 3.3.9+ मावेन ठीक काम करने लगता है।
मैक्स

@ मोम यह निर्भर करता है कि आप "अपेक्षा के अनुसार काम" के रूप में क्या परिभाषित करते हैं। मुझे लगता है कि बिल्ड पास हो जाएगा, लेकिन एक रिपॉजिटरी में स्थापित / स्थापित हो जाएगा, शायद कोई अच्छा विचार नहीं होगा क्योंकि बाल पोम में कोई संस्करण संख्या नहीं है, लेकिन केवल एक प्लेसहोल्डर है ( प्रलेखन देखें )
FrVaBe

मैं डिफ़ॉल्ट संपत्ति के साथ मूल पोम में <संस्करण> $ {पुनरीक्षण} </ संस्करण> का उपयोग करता हूं (<गुण> <संस्करण> 0.1-डिफ़ॉल्ट </ संस्करण> </ गुण>। बाल पॉम भी <संस्करण> $ {संशोधन} <का उपयोग करते हैं। / संस्करण>। मैं "mvan क्लीन इंस्टॉल -Drevision = 0.1 का उपयोग करता हूं। $ {Bamboo.buildNumber}"। जब मैं तैनाती के लॉग को स्कैन करता हूं तो सब कुछ 0.1.820 पर सेट हो जाता है और 0.1-डिफ़ॉल्ट लॉग में भी नहीं होता है (820) बिल्डनंबर है) जब मैं परिणामी जार को स्कैन करता हूं तो मुझे "इम्प्लीमेंटेशन-वर्जन: 0.1.820" मैनिफ़ेस्ट में दिखाई देता है, और pom.properties फ़ाइल में "वर्जन = 0.1.820" भी होता है। पोम फ़ाइल में ही <version> है। $ {पुनरीक्षण} </ संस्करण>। तो मुझे लगता है कि यह ठीक है?
अधिकतम

1
@ मैक्स एक जार को हल करने का प्रयास करें जहां संस्करण ${revision} एक परियोजना में निर्भरता के रूप में पोम ( मावेन भंडार में) में है। मुझे नहीं लगता कि यह काम करेगा।
FrVaBe

यह उपयोगी है सिवाय जब मैं एक रिलीज करता हूं। ${revision}नए संस्करण के साथ संस्करण टैग में वह जगह
माइक डी

21

जैसा कि यानफ्लिया ने उल्लेख किया है, इसके चारों ओर जाने का एक तरीका है।

मावेन 3.5.0 में आप मूल परियोजना से संस्करण को नीचे स्थानांतरित करने के निम्नलिखित तरीके का उपयोग कर सकते हैं:

जनक POM.xml

<project ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mydomain</groupId>
    <artifactId>myprojectparent</artifactId>
    <packaging>pom</packaging>
    <version>${myversion}</version>
    <name>MyProjectParent</name>

    <properties>
        <myversion>0.1-SNAPSHOT</myversion>
    </properties>

    <modules>
        <module>modulefolder</module>
    </modules>
    ...
</project>

मॉड्यूल POM.xml

<project ...>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.mydomain</groupId>
        <artifactId>myprojectmodule</artifactId>
        <version>${myversion}</version> <!-- This still needs to be set, but you can use properties from parent -->
    </parent>

    <groupId>se.car_o_liner</groupId>
    <artifactId>vinno</artifactId>
    <packaging>war</packaging>
    <name>Vinno</name>
    <!-- Note that there's no version specified; it's inherited from parent -->
    ...
</project>

आप myversionजो कुछ भी चाहते हैं उसे बदलने के लिए स्वतंत्र हैं जो आरक्षित संपत्ति नहीं है।


3
जब किसी अन्य परियोजना से एक मॉड्यूल का संदर्भ देते हैं, तो मावेन संपत्ति का समाधान नहीं करता है। क्या यह सामान्य है?
सिंह राशि

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

@LeoLozes क्या आपने अपनी समस्या (किसी अन्य प्रोजेक्ट से रिफरेन्स मॉड्यूल) को हल किया है?
मोर्टेजा मालवंडी

@MortezaMalvandi हाँ! मेरा जवाब नीचे है :)
LeoLozes

2
मावेन 3.6.0 इस कॉन्फ़िगरेशन के लिए चेतावनी देता है: "इन समस्याओं को ठीक करने के लिए अत्यधिक अनुशंसा की जाती है क्योंकि वे आपके निर्माण की स्थिरता को खतरा देते हैं।" "इस कारण से, भविष्य के मावेन संस्करण अब ऐसी विकृत परियोजनाओं के निर्माण का समर्थन नहीं कर सकते हैं।"
d2k2

17

आप यह भी उपयोग कर सकते हैं:

$ mvn release:update-versions -DdevelopmentVersion={version}

अपने POMs में वर्जन नंबर अपडेट करने के लिए।


10

eFox के जवाब ने एक ही परियोजना के लिए काम किया, लेकिन तब नहीं जब मैं एक मॉड्यूल को दूसरे से संदर्भित कर रहा था (pom.xml अभी भी .m2संस्करण के बजाय संपत्ति में मेरे साथ संग्रहीत था )।

हालाँकि, यह काम करता है यदि आप इसे साथ जोड़ते हैं flatten-maven-plugin, क्योंकि यह सही संस्करण के साथ poms बनाता है, संपत्ति नहीं।

एकमात्र विकल्प जिसे मैंने प्लग-इन परिभाषा में बदला है, वह है outputDirectory , यह डिफ़ॉल्ट रूप से खाली है, लेकिन मैं इसे पसंद करना चाहता हूं target, जो मेरे .gitignoreकॉन्फ़िगरेशन में सेट है :

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>flatten-maven-plugin</artifactId>
   <version>1.0.1</version>
   <configuration>
      <updatePomFile>true</updatePomFile>
      <outputDirectory>target</outputDirectory>
   </configuration>
   <executions>
      <execution>
         <id>flatten</id>
         <phase>process-resources</phase>
         <goals>
            <goal>flatten</goal>
         </goals>
      </execution>
   </executions>
</plugin>

प्लग-इन कॉन्फ़िगरेशन पैरेंट pom.xml में जाता है



0
<parent>
    <groupId>com.dummy.bla</groupId>
    <artifactId>parent</artifactId>
    <version>0.1-SNAPSHOT</version>     
 </parent>

 <groupId>com.dummy.bla.sub</groupId>
 <artifactId>kid</artifactId>

आपका मतलब है कि आप B के पोम के मूल खंड से संस्करण निकालना चाहते हैं, मुझे लगता है कि आप ऐसा नहीं कर सकते हैं, GroupId, विरूपण साक्ष्य और संस्करण ने माता-पिता के पोम समन्वय का निर्दिष्ट किया है, जो आप छोड़ सकते हैं वह है बच्चे का संस्करण।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.