การอัพเดตหมายเลขเวอร์ชันของโมดูลในโปรเจ็กต์ Maven แบบหลายโมดูล


325

ฉันมีโครงการ maven หลายโมดูล เราตั้งใจที่จะเวอร์ชั่นโมดูลเหล่านี้ทั้งหมดเข้าด้วยกัน แต่ ณ ตอนนี้ฉันกำลังสิ้นสุดรุ่นฮาร์ดโค้ดในแต่ละโมดูล 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 หลักไม่ใช่ POM รวมหลายโมดูล ดูmaven.apache.org/pom.html#Aggregation
Garret Wilson

คำตอบ:


631

ใช้versions:setจากplugin-maven plugin :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

มันจะปรับเวอร์ชัน pom ทั้งหมดเวอร์ชันพาเรนต์และเวอร์ชันการพึ่งพาในโปรเจ็กต์แบบหลายโมดูล

หากคุณทำผิดพลาดให้ทำ

mvn versions:revert

หลังจากนั้นหรือ

mvn versions:commit

หากคุณพอใจกับผลลัพธ์


หมายเหตุ: วิธีแก้ปัญหานี้สันนิษฐานว่าโมดูลทั้งหมดใช้การรวม pom เป็นพาเรนต์ pom ด้วยซึ่งเป็นสถานการณ์ที่ถือว่าเป็นมาตรฐานในเวลาที่คำตอบนี้ หากเป็นกรณีที่ไม่ไปสำหรับคำตอบของวิลสันหลังคา


5
คงจะดีมากถ้ามีวิธีแก้ปัญหาที่ไม่ต้องการให้คุณเปลี่ยนแต่ละโมดูลจริง ๆ ทางเลือกเดียวที่ฉันนึกได้คือใช้รุ่น snapshot สำหรับ parent-pom
AmanicA

54
นอกจากนี้ยังversions:setสามารถระบุได้-DgenerateBackupPoms=falseตามค่าเริ่มต้นปลั๊กอินนี้จะสำรองไฟล์ pom ดั้งเดิม
Maksim Sorokin

20
นั่นคือจุดสำคัญของversions:commit: "ลบข้อมูลสำรองเริ่มต้นของ pom ดังนั้นจึงยอมรับการเปลี่ยนแปลง"
Michael Laffargue

2
ปลั๊กอินใหม่แก้ปัญหาที่อธิบายในคำถามนี้แตกต่างกัน: mojo.codehaus.org/flatten-maven-plugin/examples/ …
Stephan

1
@MichaelLaffargue รุ่น mvn: กระทำดูเหมือนว่าจะลบไฟล์สำรองข้อมูลที่สร้างขึ้นจาก pom.xml ก่อนหน้านี้
Cris Rockwell

58

คำตอบที่กำหนดถือว่าโครงการที่สงสัยใช้การสืบทอดโครงการนอกเหนือจากการรวมโมดูล ในความเป็นจริงนั้นเป็นแนวคิดที่แตกต่าง:

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

บางโครงการอาจเป็นการรวมตัวของโมดูล แต่ไม่มีความสัมพันธ์ระหว่างพาเรนต์ - ลูกระหว่าง POM ตัวรวบรวมและโมดูลที่รวม (อาจไม่มีความสัมพันธ์แบบพ่อแม่และลูกเลยหรือโมดูลย่อยอาจใช้ POM แยกเป็น "แม่") ในสถานการณ์เหล่านี้คำตอบที่ให้จะไม่ทำงาน

หลังจากการอ่านและการทดลองเป็นอย่างมากปรากฎว่ามีวิธีการใช้ปลั๊กอิน Maven รุ่นเพื่ออัปเดตไม่เพียง แต่ตัวรวบรวม POM เท่านั้น แต่ยังรวมโมดูลทั้งหมดไว้ด้วยเช่นกัน มันเป็นprocessAllModulesตัวเลือก คำสั่งต่อไปนี้จะต้องทำในไดเรกทอรีของโครงการรวม:

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

ปลั๊กอิน Maven รุ่นนี้ไม่เพียง แต่จะอัปเดตทุกเวอร์ชั่นของโมดูลที่มีอยู่ทั้งหมด แต่ยังจะอัพเดตการพึ่งพาระหว่างโมดูล !!!! นี่เป็นชัยชนะครั้งใหญ่และจะประหยัดเวลาและป้องกันปัญหาทุกประเภท

แน่นอนว่าอย่าลืมคอมมิชชันการเปลี่ยนแปลงในโมดูลทั้งหมดซึ่งคุณสามารถทำได้ด้วยสวิตช์เดียวกัน:

mvn versions:commit -DprocessAllModules

คุณอาจตัดสินใจแจกจ่าย POMS สำรองพร้อมกันและทำทุกอย่างในคำสั่งเดียว:

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

เราจะทำให้รุ่นถัดไปเป็นอัตโนมัติเช่นเดียวกับปลั๊กอิน build-helper ได้อย่างไร
สูญเสียการแปล

ใช้ Maven 3.5.0 ฉันไม่สามารถทำงานนี้ได้ ฉันมีการรวมโครงการและมีเพียงผู้ปกครอง pom เท่านั้นที่ได้รับการปรับปรุง ฉันยังลองใช้การสืบทอดโครงการ (พร้อมกับการรวม - "กฎทั้งสาม" จากลิงก์ที่ให้ไว้) และอีกครั้งเฉพาะผู้ปกครอง pom เท่านั้นที่ได้รับการปรับปรุง
SiKing

1
พบสวิตช์ทำให้เป็นความลับ: เวอร์ชันเริ่มต้นของ pom พาเรนต์และโมดูลจะต้องเหมือนกัน! pom หลักของฉันเริ่มต้นด้วย "1-SNAPSHOT" และโมดูลมี "1.0.0-SNAPSHOT" :)
SiKing

1
ด้วยโครงการตัวรวบรวมเวอร์ชันของตัวรวบรวมและเวอร์ชันของ submodules ไม่จำเป็นต้องเหมือนกัน (เช่น pom ตัวรวบรวมของคุณอาจเปลี่ยนแปลงได้ไม่บ่อยนักและสามารถอยู่ในเวอร์ชันที่เฉพาะเจาะจงได้ คุณสมบัติหลักที่จะระบุให้กับversions:setปลั๊กอินคือ-DoldVersion='*'เมื่อmojohaus.org/versions-maven-plugin/set-mojo.htmlมันบอกอย่างชัดเจนว่าควรระบุคุณสมบัตินี้เมื่อประมวลผลโครงการรวบรวม
Matthew Wise

2
ภายใต้เงื่อนไขใดที่-DprocessAllModulesใช้งานได้จริง มันไม่ทำงานสำหรับฉัน
Alex R

24

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

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

3
ขอบคุณ @Crummy คุณช่วยชีวิตฉันไว้แล้ว
Maksim Kostromin


หรือคุณสามารถใช้-DoldVersion='*'
Matthew Wise

23

คุณอาจต้องการดูการเปิดตัวปลั๊กอินของ Maven :เป้าหมายรุ่นปรับปรุง มันจะอัปเดตเวอร์ชันของผู้ปกครองรวมถึงโมดูลทั้งหมดที่อยู่ภายใต้


อัปเดต: โปรดทราบว่าข้างต้นเป็นปลั๊กอินสำหรับการเปิดตัว หากคุณไม่ปล่อยคุณอาจต้องการใช้versions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

1
รุ่น mvn: ชุดไม่ส่งผลกระทบต่อโมดูล
9ilsdx 9rvj 0lo


ตกลงจะทำเมื่อการสร้างปฏิกรณ์อยู่ในพาเรนต์เดียวกัน มันสับสนเมื่อโครงสร้างดูเป็นอย่างอื่น ...
9ilsdx 9rvj 0lo

mvn release:update-versions -DautoVersionSubmodulesทำงานได้ดีสำหรับฉันแม้ว่าฉันจะไม่ปล่อย :-)
msa

11

ฉันขอแนะนำให้คุณอ่านMaven Book เกี่ยวกับการสร้างหลายโมดูล (เครื่องปฏิกรณ์)

ฉันหมายถึงโดยเฉพาะอย่างยิ่งต่อไปนี้:

<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
และมองหาอะไรเป็นพิเศษ?
Thorbjørn Ravn Andersen

2
+1 สำหรับการนำรูปแบบที่เหมาะสมสำหรับpom.xmlไฟล์ขึ้นมา แต่ฉันเห็นด้วย (กับ @ ThorbjørnRavnAndersen) ว่าการอ่านหนังสือทั้งเล่มสำหรับข้อมูลนี้เป็นเรื่องมากเกินไป : p
Priidu Neemre

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

1
คุณสามารถใช้รุ่น-Maven ปลั๊กอินที่จัดการทุกสิ่งนี้หรือคุณสามารถใช้ Maven ปล่อยปลั๊กอินและเพื่อให้คุณไม่ต้องจัดการด้วยตัวเอง ...
khmarbaise

5

versions:update-child-modulesดูเหมือนสิ่งที่คุณกำลังมองหา คุณสามารถทำได้หลายรุ่น: ตั้งค่าตามที่กล่าวถึง แต่นี่เป็นวิธีที่มีน้ำหนักเบาในการอัพเดทหมายเลขรุ่นหลัก สำหรับโมดูลย่อยฉันคิดว่าคุณควรลบ<version>คำจำกัดความเนื่องจากพวกเขาจะสืบทอดหมายเลขรุ่นของโมดูลหลัก


3

วิธีที่ดีที่สุดคือเนื่องจากคุณตั้งใจจะรวมโมดูลของคุณเข้าด้วยกันคุณสามารถระบุ<dependencyManagement>แท็กในส่วนใหญ่pom.xml(โมดูลหลัก) โดยตรงภายใต้<project>แท็ก ควบคุมเวอร์ชันและชื่อกลุ่ม ในโมดูลของแต่ละบุคคลของคุณคุณก็ต้องระบุแท็กของคุณ<artifactId> pom.xmlจะใช้เวอร์ชันจากไฟล์พาเรนต์


ฉันไม่สามารถหาสิ่งที่ dependencyManagement แท็กในpom.xml คุณกำลังคิดอย่างอื่นอยู่หรือไม่?
ArturoTena

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 หลักและเวอร์ชันหลักบน submodules:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.