我有Maven多模块项目,我想使用脚本将开发版本更新为给定值。聚合器POM只是一个聚合器,孩子们不会从中继承。这很重要,因为工件都继承自其他POM文件。这是我的结构
aggregator/
--projectA
--projectB
此外,projectB
对projectA
具有Maven依赖关系。
首先我尝试了:
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
的依赖?
答案 0 :(得分:6)
the release plugin你可能会有更多的运气,但可能需要一些调整
versions:set
旨在更新它执行的pom版本...即反应堆的根目录。
如果您遵循它的惯例,那么它将起作用......但您需要知道它的惯例。
当/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=...
这是因为如果父目录包含引用被调用项目的聚合器pom,versions:set
将尝试“增长”反应器......
换句话说,当你有一个没有共同父级的反应堆时,版本会假定通用版本号是偶然的,但它会从更广泛的反应堆中获取意图
答案 1 :(得分: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
答案 2 :(得分:2)
<ul class="hardcover_back">