2013-05-31 8 views
5

Mam wielomodułowy projekt Maven i chciałbym zaktualizować wersje rozwojowe do określonej wartości za pomocą skryptu. Agregator POM jest tylko agregatorem, a dzieci nie dziedziczą z niego. Jest to ważne, ponieważ artefakty wszystkie dziedziczą z innych plików POM. Oto moja konstrukcjaAktualizowanie wersji w wielomodułowym projekcie Maven

aggregator/ 
--projectA 
--projectB 

Również projectB ma zależność Maven na projectA.

Najpierw próbowałem:

mvn -DnewVersion=0.28-SNAPSHOT -DupdateMatchingVersions=true versions:set 

To tylko uaktualniona wersja projektu aggregator.

Jeśli uruchamiam proces uwalniania Maven, poprawnie aktualizuje on zależność projectB od projectA, aby użyć nowej wersji rozwojowej po wydaniu kompilacji. Ponieważ proces wydawania obsługuje to dobrze, pomyślałem, że użycie wtyczki wydania może rozwiązać mój problem.

Tak próbowałem następujące:

mvn -DdevelopmentVersion=0.28-SNAPSHOT -DautoVersionSubmodules=true --batch-mode release:update-versions 

Ta zaktualizowana wszystkich moich podprojektów poprawnie. Jednak nie zaktualizowano wersji zależnej projectB dla projectA.

Jaki jest prosty sposób aktualizacji wszystkich wersji rozwojowych w moim projekcie, w tym projectB zależność od projectA?

Odpowiedz

6

może mieć więcej szczęścia z the release plugin ale może to wymagać trochę szczypanie

versions:set jest zaprojektowany, aby zaktualizować wersję pom że wykonuje przed ... tzn korzenia reaktora.

Jeśli będziesz przestrzegać jego konwencji, to zadziała ... Ale musisz znać jego konwencje.

Kiedy masz /project/parent/versioni/project/version zarówno określone, ale „przypadkowo” przy tej samej wartości, wtyczka wersji zakłada, że ​​obie wersje są tylko przypadkowo takie same, a więc nie aktualizuje wersję projektu podrzędnego, gdy wersja rodzic jest aktualizowany. updateMatchingVersions mówi wtyczce, aby założyć, że nie jest to przypadek i że dziecko powinno być w kroku blokady.

Jeśli określisz tylko /project/parent/version i pozostawisz wersję projektu nieokreśloną, dlatego polegając na dziedziczeniu, wtyczka doda projekt podrzędny do listy zmian wersji (a przez to ponownie przejrzy wszystkie projekty, aby upewnić się, że przechwytuje wszelkie dodatkowe wymagane zmiany)

Wtyczka wersji nie zapewnia obecnie opcji wymuszania wszystkiego w jednej wersji ... Chociaż może to być dobry pomysł.

można dostać to, co chcesz z trzech komend, np

mvn versions:set -DnewVersion=... 
cd projectA 
mvn versions:set -DnewVersion=... 
cd ../projectB 
mvn versions:set -DnewVersion=... 

To dlatego versions:set będzie próbował „rosnąć” reaktor jeśli katalog nadrzędny zawiera pom zbiorczej, która odwołuje się powołać projekt ...

Innymi słowy, gdy masz reaktor bez wspólnego rodzica, wersja zakłada, że ​​wspólny numer wersji to przez przypadek, ale będzie to odebrać zamiarów z szerszym reaktora

+0

Dzięki za informację o wersjach: zestaw. To wyjaśnia lepiej zachowanie. –

+0

Być może zmieniono domyślne ustawienie 'updateMatchingVersions'? W mvn 3.2.5 domyślnie jest to "prawda", a ja chciałem odwrotnie. 'wersje mvn: set' zmienił więcej wersji niż chciałem. Podrapałem się o to, aż znalazłem odpowiedź! –

2
# for each module into aggregator pom 
for module in $(grep "\<module\>" pom.xml | sed 's/<\/module>//g' | sed 's/.*<module>//g' | sed 's/.*\///g') 
do 
    # set the version of the module 
    # and update reference to this module into others modules 
    mvn versions:set -DgenerateBackupPoms=false -DartifactId=$module \ 
     -DnewVersion=$newVersion -DupdateMatchingVersions=true 
done 
# set the version of the aggregator pom 
mvn versions:set versions:commit -DnewVersion=$newVersion 
1

znalazłem swoją same problem, następnie sklonowałem wersję kodu wtyczki, a następnie znalazłem, jeśli ustawiłeś gropuId, artifcatId, oldVersion value tobe * rozwiąże problem; podobnie jak:

mvn versions:set -DnewVersion=xxx -DgroupId=* -DartifactId=* -DoldVersion=*