2013-05-31 4 views
5

У меня есть мультимодульный проект Maven, и я хотел бы обновить версии разработки до заданного значения с помощью скрипта. Агрегатор POM - это только агрегатор, и дети не наследуют его. Это важно, потому что все артефакты наследуются от других файлов POM. Вот моя структураОбновление версий в многомодульном проекте Maven

aggregator/ 
--projectA 
--projectB 

Также projectB имеет зависимость Maven на projectA.

Сначала я попробовал:

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

Это только обновленная версия этого aggregator проекта.

Если я запускаю процесс выпуска Maven, он правильно обновляет зависимость projectB от projectA, чтобы использовать новую версию разработки после сборки выпуска. Поскольку процесс выпуска справляется с этим хорошо, я думал, что использование плагина выпуска может решить мою проблему.

Так что я попытался следующие:

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

Это обновленное все мои подпроектов правильно. Однако он не обновил версию зависимостей projectB для projectA.

Что такое простой способ обновления всех версий разработки в моем проекте, включая зависимость projectB от projectA?

ответ

6

Вы можете иметь больше удачи с the release plugin, но это может потребовать некоторой настройки

versions:set предназначен для обновления версии ПОМ, что она выполняет против ... то есть корень из реактора.

Если вы следуете его соглашениям, тогда это сработает ... Но вам нужно знать его соглашения.

Если у вас есть /project/parent/versionи/project/version как указано, но «случайно» в том же значении, плагин версии предполагает, что две версии просто случайно то же самое, и так не обновляет версию дочернего проекта, когда родитель версия обновляется. updateMatchingVersions сообщает плагину предположить, что это не случайность и что ребенок должен быть в шаге блокировки.

Если вы указали только /project/parent/version и оставьте версию проекта неуказанной, поэтому, полагаясь на наследование, плагин добавит дочерний проект в список изменений версии (и, следовательно, снова пропустит все проекты, чтобы убедиться, что он ловит любые дополнительные требования изменения)

Плагин версий в настоящее время не дает возможности принудительно привести все к одной версии ... Хотя это может быть хорошей идеей.

Вы можете получить то, что вы хотите с тремя командами, например

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

Это потому, что versions:set будет пытаться «вырастить» реактор, если родительский каталог содержит агрегатор POM, который ссылается на проект ... вызываемый

Другими словами, если у вас есть реактор без общего родителя, версии предполагается, что общий номер версии случайно, но подберут намерение от широкого реактора

+0

Спасибо за информацию о версиях: set. Это лучше объясняет поведение. –

+0

Возможно, изменилось значение по умолчанию для 'updateMatchingVersions'? В mvn 3.2.5 по умолчанию это 'истина', и мне нужна обратная. 'mvn versions: set' изменил больше версий, чем я хотел. Я почесал голову над этим, пока не нашел этот ответ! –

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

я нашел ваш же проблема, тогда я клон версии код плагина, то я нашел, если вы установите gropuId, artifcatId, значение oldVersion tobe * решит проблему; :

mvn versions:set -DnewVersion=xxx -DgroupId=* -DartifactId=* -DoldVersion=* 
Смежные вопросы