Memperbarui nomor versi modul dalam proyek Maven multi-modul


325

Saya memiliki proyek pakar multi-modul. Kami bermaksud untuk versi semua modul ini bersama-sama. Tetapi sampai sekarang saya berakhir versi hard-coding di masing-masing modul pom.xml seperti di bawah ini

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

dan modul induk utama memiliki konfigurasi di bawah ini

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

1
Pertanyaan Anda salah saji dan membingungkan orang yang memiliki POM multi-modul ("agregat") sejati. Dari contoh Anda dan dari jawaban tampaknya Anda benar-benar berbicara tentang POM induk, bukan POM agregat multi-modul. Lihat maven.apache.org/pom.html#Aggregation .
Garret Wilson

Jawaban:


631

Gunakan versions:setdari plugin versi-maven :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

Ini akan menyesuaikan semua versi pom, versi induk dan versi dependensi dalam proyek multi-modul.

Jika Anda melakukan kesalahan, lakukan

mvn versions:revert

setelah itu, atau

mvn versions:commit

jika Anda senang dengan hasilnya.


Catatan: solusi ini mengasumsikan bahwa semua modul menggunakan pom agregat sebagai pom induk juga, sebuah skenario yang dianggap standar pada saat jawaban ini. Jika bukan itu masalahnya, pilihlah jawaban Garret Wilson .


5
Akan sangat bagus jika ada solusi yang tidak mengharuskan Anda untuk benar-benar mengubah setiap modul. Satu-satunya alternatif yang dapat saya pikirkan adalah untuk selalu menggunakan versi snapshot untuk parent-pom.
AmanicA

54
Selain yang versions:setdapat ditentukan -DgenerateBackupPoms=false, karena secara default plugin ini mencadangkan file pom asli.
Maksim Sorokin

20
Itulah intinya versions:commit: "Menghapus cadangan awal pom, dengan demikian menerima perubahan."
Michael Laffargue

2
Sebuah plugin baru memecahkan masalah yang dijelaskan dalam pertanyaan ini secara berbeda: mojo.codehaus.org/flatten-maven-plugin/examples/…
Stephan

1
@MichaelLaffargue mvn versi: komit tampaknya menghapus file cadangan yang dihasilkan dari pom.xml sebelumnya
Cris Rockwell

58

Jawaban yang diberikan mengasumsikan bahwa proyek tersebut menggunakan pewarisan proyek sebagai tambahan dari agregasi modul. Sebenarnya itu adalah konsep yang berbeda:

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

Beberapa proyek mungkin merupakan agregasi modul, namun tidak memiliki hubungan orangtua-anak antara POM agregator dan modul agregat. (Mungkin tidak ada hubungan orangtua-anak sama sekali, atau modul anak dapat menggunakan POM terpisah sama sekali sebagai "orangtua".) Dalam situasi ini jawaban yang diberikan tidak akan berfungsi.

Setelah banyak membaca dan bereksperimen, ternyata ada cara untuk menggunakan Plugin Versi Maven untuk memperbarui tidak hanya POM agregator tetapi juga semua modul teragregasi juga; itu adalah processAllModulespilihan. Perintah berikut harus dilakukan dalam direktori proyek agregator:

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

Plugin Maven Versi tidak hanya akan memperbarui versi semua modul yang ada, tetapi juga akan memperbarui dependensi antar-modul !!!! Ini adalah kemenangan besar dan akan menghemat banyak waktu dan mencegah segala macam masalah.

Tentu saja jangan lupa untuk melakukan perubahan pada semua modul, yang juga dapat Anda lakukan dengan sakelar yang sama:

mvn versions:commit -DprocessAllModules

Anda dapat memutuskan untuk membuang POM cadangan sekaligus dan melakukan semuanya dalam satu perintah:

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

Bagaimana kita mengotomatisasi versi selanjutnya juga seperti halnya plugin build-helper?
Lostintranslation

Menggunakan Maven 3.5.0 saya tidak bisa menjalankan ini. Saya memiliki agregasi proyek dan hanya pom induk saja yang diperbarui. Saya juga mencoba warisan proyek (bersama dengan agregasi - "ketiga aturan" dari tautan yang disediakan), dan sekali lagi hanya pom induk yang diperbarui.
SiKing

1
Menemukan sakelar make-it-work rahasia: versi awal pom induk dan modul-modulnya harus sama! Pom orang tua saya dimulai dengan "1-SNAPSHOT" dan modul-modulnya memiliki "1.0.0-SNAPSHOT". :)
SiKing

1
Dengan proyek agregator, versi agregator dan versi submodula tidak harus sama. (Misalnya, aggregator pom Anda hanya jarang berubah dan dapat bertahan pada versi tertentu, sementara masing-masing submodul dapat memiliki siklus rilisnya sendiri). Properti utama untuk menentukan untuk versions:setplugin adalah -DoldVersion='*', di mojohaus.org/versions-maven-plugin/set-mojo.html secara eksplisit mengatakan properti ini harus ditentukan saat memproses proyek agregator.
Matthew Wise

2
Dalam kondisi apa -DprocessAllModulessebenarnya berfungsi? Itu tidak bekerja untuk saya.
Alex R

24

Jika Anda ingin mengotomatiskan proses sepenuhnya (yaitu Anda ingin menambah nomor versi tanpa harus tahu apa nomor versi saat ini), Anda dapat melakukan ini:

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

3
Terima kasih, @Crummy, Anda telah menyelamatkan hari saya
Maksim Kostromin


Atau Anda dapat menggunakan-DoldVersion='*'
Matthew Wise

23

Anda mungkin ingin melihat rilis rilis plugin Maven : goal versi pembaruan . Ini akan memperbarui versi induk serta semua modul di bawahnya.


Pembaruan: Harap perhatikan bahwa di atas adalah plugin rilis. Jika Anda tidak merilis, Anda mungkin ingin menggunakannyaversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

1
versi mvn: set tidak memengaruhi modul.
9ilsdx 9rvj 0lo


OK itu tidak ketika membangun reaktor dalam orangtua waktu yang sama. Ini membingungkan ketika struktur terlihat sebaliknya ...
9ilsdx 9rvj 0lo

mvn release:update-versions -DautoVersionSubmodulesbekerja dengan baik untuk saya, bahkan jika saya tidak merilis :-)
msa

11

Saya mendorong Anda untuk membaca Buku Maven tentang pembuatan multi-modul (reaktor).

Secara khusus saya maksudkan yang berikut ini:

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

harus diubah menjadi. Di sini berhati-hatilah dengan versi yang tidak didefinisikan hanya di bagian induk yang didefinisikan.

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

Ini tautan yang lebih baik .


10
dan mencari apa yang spesifik?
Thorbjørn Ravn Andersen

2
+1 untuk memunculkan pemformatan yang tepat untuk pom.xmlfile, tapi saya setuju (dengan @ ThorbjørnRavnAndersen) bahwa membaca seluruh buku untuk informasi ini terlalu banyak. : p
Priidu Neemre

7
Sayangnya mewarisi informasi versi dari orang tua tidak menghilangkan beban karena harus memodifikasi semua file pom dalam proyek - karena mereka semua merujuk orang tua dengan nomor versi .
Steven the Easily Amused

1
Anda dapat menggunakan versi-maven-plugin yang menangani semua hal ini atau Anda dapat menggunakan maven-release-plugin dan jadi Anda tidak perlu menangani ini secara manual ...
khmarbaise

5

versions:update-child-modulesKedengarannya seperti apa yang Anda cari. Anda dapat melakukan versi: ditetapkan seperti yang disebutkan, tetapi ini adalah cara yang ringan untuk memperbarui nomor versi induk. Untuk modul anak, saya berpendapat Anda harus menghapus <version>definisi, karena mereka akan mewarisi nomor versi modul induk.


3

Cara terbaik adalah, karena Anda berniat untuk menggabungkan modul-modul Anda bersama-sama, Anda dapat menentukan <dependencyManagement>tag di bagian paling luar pom.xml(modul induk) langsung di bawah <project>tag. Ini mengontrol versi dan nama grup. Dalam modul individual Anda, Anda hanya perlu menentukan <artifactId>tag di pom.xml. Ini akan mengambil versi dari file induk.


Saya tidak dapat menemukan tag dependencyManagement di pom.xml . Apakah Anda memikirkan hal lain ?
ArturoTena

0

cara termudah adalah mengubah versi di setiap pom.xml ke versi sewenang-wenang. kemudian periksa manajemen ketergantungan untuk menggunakan versi modul yang benar yang digunakan dalam modul ini! misalnya, jika Anda ingin meningkatkan versi untuk proyek modul derek, Anda harus melakukan seperti mengalir:

dalam modul childe:

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

dan dalam modul induk:

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

0

Untuk memperbarui pom.xml utama dan versi induk pada submodul:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.