Çok modüllü Maven projesinde modüllerin sürüm numaralarını güncelleme


325

Çok modüllü bir maven projem var. Tüm bu modülleri birlikte versiyonlamayı planlıyoruz. Ama şu an pom.xml modülünün her birinde aşağıdaki gibi sabit kodlama sürümünü bitiriyorum

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

ve ana üst modül aşağıdaki yapılandırmaya sahiptir

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

1
Sorunuz yanlış yazılmış ve gerçek çok modüllü ("toplam") POM'lara sahip kişilerin kafasını karıştırıyor. Örneğinizden ve yanıtlardan, gerçekten çok modüllü, toplu bir POM'den değil, bir üst POM'dan bahsediyorsunuz. Bkz. Maven.apache.org/pom.html#Aggregation .
Garret Wilson

Yanıtlar:


631

Kullanım versions:setgelen sürümleri-maven plugin :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

Çok modüllü bir projede tüm pom versiyonlarını, ebeveyn versiyonlarını ve bağımlı versiyonlarını ayarlayacaktır.

Eğer bir hata yaptıysan,

mvn versions:revert

daha sonra veya

mvn versions:commit

sonuçlardan memnunsanız.


Not: Bu çözüm, tüm modüllerin agrega pom'u ana pom olarak kullandığını varsayar; bu, bu cevap sırasında standart olarak kabul edilir. Eğer durum böyle değilse, Garret Wilson'un cevabına gidin .


5
Her bir modülü gerçekten değiştirmenizi gerektirmeyen bir çözüm olsaydı harika olurdu. Aklıma gelen tek alternatif ebeveyn-pom için her zaman bir enstantane versiyonu kullanmaktır.
AmanicA

54
Ayrıca hiç versions:setbirinde belirtebilirsiniz -DgenerateBackupPoms=falseBu eklenti geri ups orijinal pom dosyaları varsayılan olarak olarak.
Maksim Sorokin

20
Bu amacı budur versions:commit"pom, böylece değişiklikleri kabul başlangıç yedekleme kaldırır.":
Michael Laffargue

2
Yeni bir eklenti, bu soruda açıklanan sorunu farklı şekilde çözüyor
Stephan

1
@MichaelLaffargue mvn sürümleri: taahhüt önceki pom.xml'den oluşturulan yedekleme dosyalarını kaldırıyor gibi görünüyor
Cris Rockwell

58

Verilen cevap, söz konusu projenin modül toplamaya ek olarak proje mirasını kullandığını varsayar. Aslında bunlar farklı kavramlardır:

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

Bazı projeler modüllerin bir araya gelmesi olabilir, ancak toplayıcı POM ile toplanan modüller arasında bir üst-alt ilişkisi yoktur. (Hiçbir ebeveyn-çocuk ilişkisi olmayabilir veya alt modüller "ebeveyn" olarak tamamen ayrı bir POM kullanabilir.) Bu durumlarda verilen cevap çalışmaz.

Çok fazla okuma ve denemeden sonra, sürüm toplayıcı eklentisini yalnızca toplayıcı POM'yi değil tüm toplanan modülleri de güncellemek için kullanmanın bir yolu olduğu ortaya çıkıyor ; öyle processAllModulesseçeneği. Toplayıcı projesinin dizininde aşağıdaki komutun yapılması gerekir:

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

Versiyon Maven Eklentisi sadece içerilen tüm modüllerin versiyonlarını güncellemekle kalmayacak, aynı zamanda modüller arası bağımlılıkları da güncelleyecektir !!!! Bu büyük bir kazançtır ve çok zaman kazandıracak ve her türlü sorunu önleyecektir.

Elbette, aynı anahtarla da yapabileceğiniz tüm modüllerde değişiklik yapmayı unutmayın:

mvn versions:commit -DprocessAllModules

Yedek POMS'dan tamamen vazgeçmeye ve her şeyi tek bir komutta yapmaya karar verebilirsiniz:

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

Yapım yardımcısı eklentisi gibi bir sonraki sürümü nasıl otomatikleştirebiliriz?
lostintranslation

Maven 3.5.0 kullanarak bunu çalıştıramıyorum. Proje toplama var ve sadece ebeveyn pom güncellendi. Ayrıca proje mirası denedim (toplama ile birlikte - sağlanan bağlantıdan "üç kural") ve yine sadece ebeveyn pom güncellendi.
SiKing

1
Gizli yap-çalıştır anahtarını buldum: ebeveyn pom ve modüllerin başlangıç ​​sürümü aynı olmalı! Ana pompam "1-SNAPSHOT" ile başlıyordu ve modüllerde "1.0.0-SNAPSHOT" vardı. :)
19'da SiKing

1
Toplama projesi ile toplayıcının sürümü ve alt modüllerin sürümleri aynı olmak zorunda değildir . (Örneğin, toplayıcı pompanız sadece nadiren değişebilir ve belirli bir versiyonda kalabilir, ancak ayrı alt modüllerin kendi serbest bırakma döngüleri olabilir). versions:setEklentiye belirtilecek anahtar özellik -DoldVersion='*', mojohaus.org/versions-maven-plugin/set-mojo.html adresinde , bir toplayıcı proje işlenirken bu özelliğin belirtilmesi gerektiğini açıkça belirtir.
Matthew Wise

2
-DprocessAllModulesGerçekten hangi koşullar altında çalışır? Benim için işe yaramıyor.
Alex R

24

İşlemi tam olarak otomatikleştirmek istiyorsanız (yani, geçerli sürüm numarasının ne olduğunu bilmeden sürüm numarasını artırmak istiyorsanız), bunu yapabilirsiniz:

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

3
Teşekkürler, @Crummy, günümü kurtardın
Maksim Kostromin


Veya kullanabilirsiniz-DoldVersion='*'
Matthew Wise

23

Maven yayın eklentisinin yayın: güncelleme sürümleri hedefine bakmak isteyebilirsiniz . Ebeveynin sürümünü ve altındaki tüm modülleri güncelleyecektir.


Güncelleme: Lütfen yukarıdaki sürümün eklenti olduğunu unutmayın. Serbest bırakmıyorsanız kullanmak isteyebilirsinizversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

1
mvn sürümü: set modülleri etkilemez.
9ilsdx 9rvj 0lo


Tamam reaktör yapısı aynı zamanda üst olduğunda. Yapı başka türlü göründüğünde kafa karıştırıcı ...
9ilsdx 9rvj 0lo

mvn release:update-versions -DautoVersionSubmodulesBen serbest bırakmasam bile benim için iyi çalıştı :-)
msa

11

Çok modüllü (reaktör) yapılarla ilgili Maven Book'u okumanızı tavsiye ederim .

Özellikle aşağıdakileri kastediyorum:

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

olarak değiştirilmelidir. Burada tanımlı olmayan versiyona sadece tanımlanmış üst kısımda dikkat edin.

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

Bu daha iyi bir bağlantı .


10
ve özellikle neye bakmalı?
Thorbjørn Ravn Andersen

2
pom.xmlDosyalar için doğru biçimlendirmeyi getirmek için +1 , ancak (@ ThorbjørnRavnAndersen ile) bu bilgi için bir kitap okumanın aşırı olduğunu kabul ediyorum. : p
Priidu Neemre

7
Ne yazık ki sürüm bilgilerinin üst öğeden devralınması , projedeki tüm pom dosyalarını değiştirmek zorunda olma yükünü ortadan kaldırmaz - çünkü hepsi üst öğeye sürüm numarasına başvurur.
Steven the kolayca eğlendirdi

1
Tüm bunları işleyen sürümleri-maven-eklentisini kullanabilirsiniz ya da maven-release-eklentisini kullanabilirsiniz ve bu yüzden manuel olarak işlemeniz gerekmez ...
khmarbaise

5

versions:update-child-modulesaradığınıza benziyor. Sürümleri yapabilirsiniz: belirtildiği gibi ayarlayın, ancak bu, üst sürüm numaralarını güncellemenin hafif bir yoludur. Alt modüller için, <version>ana modülün sürüm numarasını devralacakları için tanımları kaldırmanız gerektiğine inanıyorum.


3

En iyi yol, modüllerinizi bir araya getirmeyi planladığınız için, <dependencyManagement>etiketi en dışta pom.xml(ana modül) doğrudan <project>etiketin altında belirtebilirsiniz . Sürümü ve grup adını kontrol eder. Bireysel modülünüzde, yalnızca <artifactId>etiketinizi belirtmeniz gerekir pom.xml. Sürümü üst dosyadan alacaktır.


Pom.xml etiketinde bağımlılığı bulamıyorum . Başka bir şey mi düşünüyorsun ?
ArturoTena

0

En kolay yol, her pom.xml dosyasındaki sürümü keyfi sürüme dönüştürmektir. o zaman bu modülde kullanılan modülün doğru sürümünü kullanmak için bağımlılık yönetimini kontrol edin! örneğin, bir çekici modülü projesi için sürüm yükseltmeyi artırmak istiyorsanız, u akış gibi yapmalısınız:

childe modülünde:

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

ve üst modülde:

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

0

Alt modüllerdeki ana pom.xml ve üst sürümü güncellemek için:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.