การสืบทอดรุ่น Maven โครงการ - ฉันต้องระบุเวอร์ชันหลักหรือไม่


189

ฉันมีสองโครงการ: โครงการหลัก: A, โครงการย่อย: B

A / pom.xml:

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

และใน B / 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>

ฉันต้องการ B เพื่อสืบทอดรุ่นจากผู้ปกครองเพื่อให้เป็นสถานที่เดียวในกรณีของฉันฉันจำเป็นต้องใส่เป็น0.1-SNAPSHOT A/pom.xmlแต่ถ้าฉันลบออก<version>0.1-SNAPSHOT</version>จากB/pom.xmlภายใต้หัวข้อหลัก Maven บ่นเกี่ยวกับรุ่นที่ขาดหายไปสำหรับผู้ปกครอง

มีวิธีที่ฉันสามารถใช้${project.version}หรืออะไรแบบนี้เพื่อหลีกเลี่ยงการมี01.-SNAPSHOTทั้งปอม?


4
คุณจะต้องรอ Maven 3.1 สำหรับเรื่องนั้นฉันกลัว
การรับรู้



1
ลิงค์ด้านบนได้ถูกย้าย สถานะสุดท้ายคือ "ปิด / ไม่แก้ไข" problems.apache.org/jira/browse/MNG-624
jocull

คำตอบ:


86

แก้ไข:ตั้งแต่ Maven 3.5.0 มีทางออกที่ดีสำหรับการใช้${revision}ตัวยึดตำแหน่ง ดูคำตอบของ FrVaBeสำหรับรายละเอียด สำหรับเวอร์ชัน Maven ก่อนหน้าดูคำตอบต้นฉบับของฉันด้านล่าง


ไม่ไม่มี คุณต้องระบุรุ่นของผู้ปกครองเสมอ โชคดีที่มันได้รับการสืบทอดเป็นเวอร์ชันของโมดูลสิ่งที่เป็นที่ต้องการในกรณีส่วนใหญ่ นอกจากนี้การประกาศรุ่นของผู้ปกครองนี้จะถูกชนโดยอัตโนมัติโดย Maven Release Plugin ดังนั้นที่จริงแล้ว - ไม่ใช่ปัญหาที่คุณมีรุ่นใน 2 แห่งตราบใดที่คุณใช้ Maven Release Plugin สำหรับการปล่อยหรือกระแทกรุ่น

โปรดสังเกตว่ามีบางกรณีเมื่อพฤติกรรมนี้ค่อนข้างโอเคและให้ความยืดหยุ่นมากกว่าที่คุณอาจต้องการ บางครั้งคุณต้องการใช้รุ่นก่อนหน้าของผู้ปกครองบางรุ่นเพื่อสืบทอด แต่นั่นไม่ใช่กรณีหลัก


3
ตอนนี้คุณสามารถใช้${revision}ตัวยึดตำแหน่งสำหรับสิ่งนี้ ดูคำตอบของฉัน ;-)
FrVaBe

2
นี่ล้าสมัยแล้ว - ตรวจสอบคำตอบของ @ FrVaBe ที่นี่: stackoverflow.com/a/51969067/514483
robd

@FrVaBe เกิดอะไรขึ้นถ้าเรามีผู้ปกครองซ้อนอยู่กับรุ่นที่แตกต่างกัน? เราไม่สามารถใช้คุณสมบัติ $ {revision} หนึ่งที่นั่นมันไม่เพียงพอ
halil

@halil คำถามเกี่ยวกับการสืบทอดเวอร์ชันจากพาเรนต์ที่มีเป้าหมายเพื่อให้มีเวอร์ชันเดียวกันในสองสิ่งประดิษฐ์ หากคุณมีผู้ปกครองที่แตกต่างกันซึ่งมีเวอร์ชั่นต่างกัน (ในลำดับชั้นการสืบทอด) คุณอาจจะไม่ทำให้พวกเขาเป็นเวอร์ชั่นเดียวกันทั้งหมด ฉันจึงไม่เข้าใจความคิดเห็นทั้งหมด
FrVaBe

86

Maven ไม่ได้ออกแบบมาเพื่อทำงานในลักษณะนั้น แต่มีวิธีแก้ไขปัญหาเพื่อให้บรรลุเป้าหมายนี้ (อาจมีผลข้างเคียงคุณต้องลอง) เคล็ดลับคือการบอกโปรเจ็กต์ลูกเพื่อค้นหาพาเรนต์ผ่านเส้นทางสัมพัทธ์แทนที่จะเป็นพิกัด maven บริสุทธิ์และนอกเหนือจากการส่งออกหมายเลขเวอร์ชันในคุณสมบัติ:

ปอม

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

ฉันใช้เคล็ดลับนั้นชั่วครู่หนึ่งในโครงการของฉันโดยไม่มีปัญหาใด ๆ ยกเว้นความจริงที่ว่า maven บันทึกคำเตือนจำนวนมากที่จุดเริ่มต้นของการสร้างซึ่งไม่ได้สวยงามมาก

แก้ไข

ดูเหมือนว่า maven 3.0.4 ไม่อนุญาตให้มีการกำหนดค่าอีกต่อไป


2
ใช่ฉันกลัวว่า Maven ไม่ได้ถูกออกแบบมาให้ทำงานเช่นนั้นดีกว่าแค่ติดกับรุ่นใน pom.xml ย่อย maven release plugin ไม่สนใจรุ่นที่ใช้อยู่
Shengjie

7
สำหรับ 3.0.5 ทำงานได้ดี คุณควรใส่ <properties> ไว้ด้านบนสุด
ses

7
มันทำงานได้ใน 3.2.3 ตำแหน่งของ <properties> ไม่สำคัญ คุณจะได้รับคำเตือนว่า:'version' contains an expression but should be a constant.
kapex

4
โปรดระวังสิ่งนี้ สิ่งนี้ไม่ทำงานเมื่อโครงการของคุณถูกอ้างอิงโดยโครงการอื่น สถานที่ให้บริการจะไม่ได้รับการแก้ไขและจะได้รับการปฏิบัติอย่างแท้จริง (เช่น $ {my.version}) สิ่งนี้จะนำไปสู่ความล้มเหลวเมื่อแก้ไขการอ้างอิง
spekdrum

2
ฉันเคยใช้สิ่งนี้มาระยะหนึ่งแล้วและใช้งานได้ดี (ปัจจุบันมี maven 3.3.9) สำหรับโครงการโมดูลเดี่ยวหลายโครงการ อย่างไรก็ตามเมื่อโครงการของคุณกลายเป็นสิ่งที่ต้องพึ่งพาอีกโครงการหนึ่ง ฉันขอแนะนำให้ยอมรับข้อเสนอแนะที่เสนอโดย @pay ด้านล่าง
แยบยล

81

วิธีที่ง่ายที่สุดในการอัปเดตเวอร์ชัน IMO:

$ mvn versions:set -DgenerateBackupPoms=false

(ทำเช่นนั้นในโฟลเดอร์ root / parent pom ของคุณ)

POM ของคุณจะถูกแยกวิเคราะห์และคุณถูกขอให้ตั้งค่าเวอร์ชันใด


17
คุณยังสามารถเพิ่ม -DnewVersion = {versionToBeUpdated} เพื่อหลีกเลี่ยงการป้อนแบบโต้ตอบ
Mukesh

1
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดมันทำให้การเปลี่ยนแปลงเวอร์ชันเป็นไปโดยอัตโนมัติโดยไม่ทำให้โครงการย่อยเสียหาย (ซึ่งคุณจะไม่สามารถอ้างอิงได้หากไม่มี parent pom)
Tarek

ได้! นี่คือคำตอบ 🙌
aaiezza

หาก child และ parent pom เวอร์ชันเริ่มแรกให้อัพเดตให้ตรงกันก่อน mvn versions:update-child-modules อื่นเวอร์ชัน pom ของโมดูลลูกทั้งหมดจะถูกข้ามไป
Gautam Tadigoppula

75

ตั้งแต่ Maven 3.5.0 คุณสามารถใช้${revision}ตัวยึดตำแหน่งสำหรับสิ่งนั้น การใช้เป็นเอกสารที่นี่: รุ่น Maven CI มิตร

ในระยะสั้นผู้ปกครอง pomมีลักษณะเช่นนี้ (อ้างจากเอกสาร Apache):

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

คุณต้องใช้ปลั๊กอิน Flatten Mavenเพื่อสร้างเอกสาร pom โดยมีหมายเลขรุ่นเฉพาะสำหรับการปรับใช้ HowTo ได้รับการบันทึกไว้ในเอกสารที่เชื่อมโยงแล้ว

@khmarbaise ยังเขียนโพสต์บล็อกเกี่ยวกับคุณสมบัตินี้อีกด้วย: Maven: ไฟล์ POM ที่ไม่มีเวอร์ชั่นอยู่ใช่ไหม


ฉันกำหนดค่าโครงการเหมือนที่คุณอธิบาย แต่ไม่มี "Flatten Maven Plugin" และดูเหมือนว่าจะทำงานได้ตามที่คาดหวังเป็นไปได้หรือไม่ นอกจากนี้ฉันได้รับข้อผิดพลาดกับ maven 3.2.1 แต่ maven 3.3.9+ ดูเหมือนว่าจะทำงานได้ดี
สูงสุด

@ Max มันขึ้นอยู่กับสิ่งที่คุณกำหนดว่า "ทำงานอย่างที่คาดไว้" ฉันเดาว่าบิลด์จะผ่าน แต่ติดตั้ง / ปรับใช้กับที่เก็บข้อมูลอาจไม่เป็นความคิดที่ดีเพราะไม่มีหมายเลขเวอร์ชันใน child pom แต่มีตัวยึดตำแหน่งเท่านั้น (ดูเอกสารประกอบ )
FrVaBe

ฉันใช้ <version> $ {revision} </version> ใน parent pom พร้อมด้วยคุณสมบัติเริ่มต้น (<properties> <version> 0.1- ค่าเริ่มต้น </version> </properties> ปอมเด็กยังใช้ <version> $ {revision} < / version>. ฉันใช้ "mvn clean install -Drevision = 0.1. $ {bamboo.buildNumber}" เมื่อฉันสแกนบันทึกการปรับใช้ทุกอย่างถูกตั้งค่าเป็น 0.1.820 และค่าเริ่มต้น 0.1 ไม่ได้อยู่ในบันทึก (820 คือ buildNumber) เมื่อฉันสแกน jar ที่ได้ฉันเห็น "Implementation-Version: 0.1.820" ในไฟล์ Manifest และ "version = 0.1.820" ในไฟล์ pom.properties ไฟล์ pom นั้นมี <version> $ {revision} </version> ดังนั้นฉันคิดว่าไม่เป็นไร
สูงสุด

1
@ Max พยายามแก้ไข jar ที่เวอร์ชันอยู่${revision} ใน pom (ในที่เก็บ maven) เป็นการอ้างอิงในโครงการอื่น ฉันไม่คิดว่าสิ่งนี้จะได้ผล
FrVaBe

สิ่งนี้มีประโยชน์ยกเว้นเมื่อฉันปล่อย ที่มาแทนที่${revision}ในแท็กเวอร์ชันด้วยเวอร์ชันใหม่
Mike D

21

ตามที่ Yanflea พูดถึงมีวิธีที่จะไปรอบ ๆ นี้

ใน Maven 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
เมื่ออ้างอิงโมดูลจากโครงการอื่น Maven จะไม่แก้ไขคุณสมบัติ เป็นเรื่องปกติหรือไม่
LeoLozes

ฉันเชื่อว่าคำถามนั้นอาจมีค่าสำหรับการเข้ามาของตัวเองและไม่ได้อยู่ในความคิดเห็นเช่นนี้ หากไม่เห็นรหัสของคุณฉันสามารถเดาได้เท่านั้น
eFox

@LeoLozes คุณแก้ไขปัญหาของคุณ (โมดูล refrence จากโครงการอื่น)?
Morteza Malvandi

@MortezaMalvandi ใช่! คำตอบของฉันอยู่ที่ด้านล่าง :)
23419

2
Maven 3.6.0 ให้คำเตือนสำหรับการกำหนดค่านี้: "ขอแนะนำอย่างยิ่งให้แก้ไขปัญหาเหล่านี้เพราะพวกเขาคุกคามความมั่นคงของงานสร้างของคุณ" "ด้วยเหตุผลนี้เวอร์ชัน Maven ในอนาคตอาจไม่สนับสนุนการสร้างโครงการที่มีรูปแบบผิดปกติอีกต่อไป"
d2k2


10

อีหมาจิ้งจอกคำตอบของการทำงานสำหรับโครงการเดียว แต่ไม่ได้เมื่อฉันถูกอ้างอิงโมดูลจากอีกคนหนึ่ง (pom.xml ยังคงถูกเก็บไว้ในของฉัน.m2กับอสังหาริมทรัพย์แทนรุ่นที่)

อย่างไรก็ตามมันจะทำงานได้ถ้าคุณรวมมันเข้ากับflatten-maven-pluginเพราะมันจะสร้างปอมด้วยรุ่นที่ถูกต้องไม่ใช่คุณสมบัติ

ตัวเลือกเดียวที่ฉันเปลี่ยนไปในนิยามของปลั๊กอินคือ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>

การกำหนดค่าปลั๊กอินไปในparent 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>

คุณหมายถึงคุณต้องการลบเวอร์ชันออกจากบล็อกหลักของ pom ของ B ฉันคิดว่าคุณไม่สามารถทำได้มัน groupId, artifactId และรุ่นที่ระบุพิกัด pom ของผู้ปกครองสิ่งที่คุณสามารถละเว้นได้คือเวอร์ชันของเด็ก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.