5

我有 Maven 多模块项目,我想使用脚本将开发版本更新为给定值。聚合器 POM 只是一个聚合器,子代不会从它继承。这很重要,因为工件都继承自其他 POM 文件。这是我的结构

aggregator/
--projectA
--projectB

此外,projectBMaven 依赖于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

4

3 回答 3

6

您可能对发布插件有更多的运气,但它可能需要一些调整

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

这是因为versions:set如果父目录包含引用被调用项目的聚合器 pom,将尝试“增长”反应器......

换句话说,当您有一个没有公共父级的反应器时,版本会假设公共版本号是偶然的,但它会从更广泛的反应器中获取意图

于 2013-06-01T08:28:09.983 回答
2

我发现你同样的问题,然后我克隆版本插件代码,然后我发现如果你将 gropuId,artifcatId,oldVersion 值设置为 * 将解决问题;像这样 :

mvn versions:set -DnewVersion=xxx -DgroupId=* -DartifactId=* -DoldVersion=* 
于 2017-09-04T10:37:52.037 回答
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
于 2015-11-26T04:05:19.620 回答