在Maven多模块项目中更新版本

5

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

aggregator/
--projectA
--projectB

另外,projectB 依赖于 projectA 的 Maven 包。

首先我尝试了:

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

它只更新了aggregator项目的版本。

如果我运行Maven发布流程,它会正确地更新projectBprojectA的依赖关系,以使用新的开发版本进行发布构建。因为发布过程可以很好地处理这个问题,所以我认为使用发布插件可能会解决我的问题。

所以我尝试了以下操作:

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

这更新了我所有的子项目。但是它没有更新projectB对projectA的依赖版本。
有什么简单的方法可以更新我的项目中所有开发版本,包括projectB对projectA的依赖关系?
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 会尝试“扩展”整个反应堆(reactor),如果父目录包含一个聚合 POM,该 POM 引用了被调用的项目... 换句话说,当您有一个没有共同父级的反应堆时,versions 假定共同的版本号是偶然的,但它会从更广泛的反应堆中获取意图。

感谢关于版本设置的信息。这解释了行为更好。 - David V
也许 updateMatchingVersions 的默认值被改变了?在 mvn 3.2.5 中,默认值为 true,而我想要相反的结果。mvn versions:set 更改了比我想要的更多的版本。我一直苦思冥想,直到找到了这个答案! - Olaf Seibert

2

我发现你遇到了同样的问题,然后我克隆了版本插件代码,然后我发现如果你将groupId、artifactId和oldVersion的值设置为*,就可以解决这个问题;像这样:

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

-DoldVersion=* 对我来说是最重要的东西。 - Osmar

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接