Aktualizacja numerów wersji modułów w wielomodułowym projekcie Maven

325

Mam wielomodułowy projekt maven. Zamierzamy razem zaktualizować wszystkie te moduły. Ale na razie kończę wersję na stałe w każdym module pom.xml, jak poniżej

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

a główny moduł nadrzędny ma poniższą konfigurację

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>
sandeepkunkunuru
źródło
1
Twoje pytanie jest zniekształcone i dezorientuje ludzi, którzy mają prawdziwe POM wielomodułowe („agregujące”). Z twojego przykładu i odpowiedzi wynika, że ​​tak naprawdę mówisz o nadrzędnej POM, a nie o wielomodułowym, zagregowanym POM. Zobacz maven.apache.org/pom.html#Aggregation .
Garret Wilson

Odpowiedzi:

631

Stosowanie versions:setz wersjami-Maven plugin :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

Dostosuje wszystkie wersje pom, wersje nadrzędne i wersje zależności w projekcie wielomodułowym.

Jeśli popełniłeś błąd, zrób to

mvn versions:revert

później lub

mvn versions:commit

jeśli jesteś zadowolony z wyników.


Uwaga: w tym rozwiązaniu założono, że wszystkie moduły używają również pom pom agregate, co jest scenariuszem uznanym za standardowy w momencie udzielania odpowiedzi. Jeśli tak nie jest, skorzystaj z odpowiedzi Garreta Wilsona .

Sean Patrick Floyd
źródło
5
Byłoby wspaniale, gdyby istniało rozwiązanie, które nie wymaga faktycznej zmiany każdego modułu. Jedyną alternatywą, jaką mogę wymyślić, jest zawsze użycie wersji migawki dla elementu nadrzędnego.
AmanicA
54
Oprócz tego versions:setmożna określić -DgenerateBackupPoms=false, ponieważ domyślnie ta wtyczka tworzy kopie zapasowe oryginalnych plików pom.
Maksim Sorokin
20
Właśnie o to chodzi versions:commit: „Usuwa początkową kopię zapasową pom, akceptując w ten sposób zmiany”.
Michael Laffargue
2
Nowa wtyczka rozwiązuje problem opisany w tym pytaniu inaczej: mojo.codehaus.org/flatten-maven-plugin/examples/…
Stephan
1
@MichaelLaffargue mvn wersje: zatwierdzanie wydaje się usuwać pliki kopii zapasowej wygenerowane z poprzedniego pom.xml
Cris Rockwell
58

Podana odpowiedź zakłada, że ​​dany projekt oprócz agregacji modułów korzysta z dziedziczenia projektu. W rzeczywistości są to odrębne pojęcia:

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

Niektóre projekty mogą być agregacją modułów, ale nie mają relacji rodzic-dziecko między agregatorem POM a modułami agregowanymi. (Może nie być w ogóle żadnych relacji rodzic-dziecko lub moduły potomne mogą używać osobnego POM jako „rodzic”). W takich sytuacjach dana odpowiedź nie zadziała.

Po wielu lekturach i eksperymentach okazuje się, że istnieje sposób na użycie wtyczki Versions Maven do aktualizacji nie tylko POM agregatora, ale także wszystkich modułów zagregowanych; to jest processAllModulesopcja. W katalogu projektu agregatora należy wykonać następujące polecenie:

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

Wtyczka Versions Maven nie tylko zaktualizuje wersje wszystkich zawartych modułów, ale także zaktualizuje zależności między modułami !!!! To ogromna wygrana, która pozwoli zaoszczędzić dużo czasu i zapobiegnie różnego rodzaju problemom.

Oczywiście nie zapomnij zatwierdzić zmian we wszystkich modułach, co możesz również zrobić za pomocą tego samego przełącznika:

mvn versions:commit -DprocessAllModules

Możesz zrezygnować z tworzenia kopii zapasowych POMS i zrobić wszystko za pomocą jednego polecenia:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false
Garret Wilson
źródło
Jak automatyzujemy kolejną wersję, podobnie jak wtyczka build-helper?
lostintranslation
Korzystanie z Maven 3.5.0 Nie mogę tego uruchomić. Mam agregację projektów i tylko pom pom-rodzic został zaktualizowany. Próbowałem również dziedziczenia projektu (wraz z agregacją - „wszystkie trzy reguły” z podanego linku) i ponownie tylko pom pom-rodzic został zaktualizowany.
SiKing
1
Znaleziono tajny przełącznik make-it-work: początkowa wersja nadrzędnej pom i modułów musi być taka sama! Mój rodzic-pom zaczął od „1-SNAPSHOT”, a moduły miały „1.0.0-SNAPSHOT”. :)
SiKing
1
W przypadku projektu agregatora wersja agregatora i wersje submodułów nie muszą być takie same. (Np. Agregator pom może zmieniać się tylko rzadko i może pozostać w określonej wersji, podczas gdy poszczególne submoduły mogą mieć własne cykle wydawania). Kluczową właściwością do określenia we versions:setwtyczce jest -DoldVersion='*', na mojohaus.org/versions-maven-plugin/set-mojo.html wyraźnie mówi, że ta właściwość powinna zostać określona podczas przetwarzania projektu agregatora.
Matthew Wise
2
W jakich warunkach -DprocessAllModulesfaktycznie działa? To nie działa dla mnie.
Alex R
24

Jeśli chcesz w pełni zautomatyzować proces (tzn. Chcesz zwiększyć numer wersji bez konieczności poznania aktualnego numeru wersji), możesz to zrobić:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit
Malcolm Crum
źródło
3
Dzięki, @Crummy, uratowałeś mi dzień
Maksim Kostromin
Lub możesz użyć-DoldVersion='*'
Matthew Wise
23

Być może warto przyjrzeć się wydaniu wtyczki Maven : aktualizacja wersji . Zaktualizuje wersję nadrzędną, a także wszystkie moduły pod nią.


Aktualizacja: Należy pamiętać, że powyższa wersja jest wtyczką wydania. Jeśli nie zwalniasz, możesz użyćversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT
Nishant
źródło
1
Wersja mvn: zestaw nie wpływa na moduły.
9ilsdx 9rvj 0lo
OK dzieje się tak, gdy budowa reaktora jest w tym samym czasie nadrzędna. Jest to mylące, gdy struktura wygląda inaczej ...
9ilsdx 9rvj 0lo
mvn release:update-versions -DautoVersionSubmodulesdziałało dla mnie dobrze, nawet jeśli nie wypuszczam :-)
msa
11

Zachęcam do przeczytania Księgi Maven o kompilacjach wielomodułowych (reaktorów).

Miałem na myśli w szczególności:

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

należy zmienić na. Tutaj dbaj o niezdefiniowaną wersję tylko w części nadrzędnej, w której jest zdefiniowana.

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

To jest lepszy link .

Khmarbaise
źródło
10
i po co konkretnie?
Thorbjørn Ravn Andersen
2
+1 za wywołanie odpowiedniego formatowania pom.xmlplików, ale zgadzam się (z @ ThorbjørnRavnAndersen), że czytanie całej książki z tymi informacjami jest przesadą. : p
Priidu Neemre
7
Niestety, dziedziczenie informacji o wersji od rodzica nie usuwa obciążenia związanego z koniecznością modyfikacji wszystkich plików pom w projekcie - ponieważ wszystkie odwołują się do rodzica według numeru wersji .
Steven the Easy Amused
1
Możesz użyć wersji-maven-plugin, która obsługuje wszystkie te rzeczy, lub możesz użyć wtyczki-maven-release-plug-in, więc nie musisz zajmować się tym ręcznie ...
Khmarbaise
5

versions:update-child-modulesbrzmi jak to, czego szukasz. Możesz zrobić wersje: ustaw jak wspomniano, ale jest to lekki sposób na aktualizację numerów wersji nadrzędnych. W przypadku modułów podrzędnych moim zdaniem należy usunąć <version>definicje, ponieważ odziedziczą one numer wersji modułu nadrzędnego.

Jon Onstott
źródło
3

Najlepszym sposobem jest to, że ponieważ zamierzasz połączyć swoje moduły razem, możesz określić <dependencyManagement>znacznik w najbardziej zewnętrznej pom.xml(module macierzystym) bezpośrednio pod <project>znacznikiem. Kontroluje wersję i nazwę grupy. W swoim indywidualnym module wystarczy podać <artifactId>tag w swoim pom.xml. Będzie pobierał wersję z pliku nadrzędnego.

murali
źródło
Nie mogę znaleźć tagu dependenceManagement na pom.xml . Czy myślisz o czymś innym ?
ArturoTena
0

najprostszym sposobem jest zmiana wersji w każdym pliku pom.xml na dowolną. następnie sprawdź zarządzanie zależnościami, aby użyć poprawnej wersji modułu używanego w tym module! na przykład, jeśli chcesz zwiększyć wersjonowanie dla projektu modułu holowniczego, musisz zrobić to tak:

w module childe:

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

oraz w module nadrzędnym:

<groupId>com.A</groupId>
<artifactId>A-application</artifactId>
<version>new-version</version>
Mojtaba Mirakbari
źródło
0

Aby zaktualizować główny pom.xml i wersję nadrzędną w submodułach:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
angel.lopezrial
źródło