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

Dav*_*d V 5 maven-3 maven

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

aggregator/
--projectA
--projectB
Run Code Online (Sandbox Code Playgroud)

此外,projectB还有Maven依赖projectA.

首先我试过:

mvn -DnewVersion=0.28-SNAPSHOT -DupdateMatchingVersions=true versions:set
Run Code Online (Sandbox Code Playgroud)

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

如果我运行Maven发布过程,它会正确更新 在发布版本之后使用新开发版本projectB的依赖性projectA.因为发布过程处理得很好,我认为使用发布插件可能会解决我的问题.

所以我尝试了以下方法:

mvn -DdevelopmentVersion=0.28-SNAPSHOT -DautoVersionSubmodules=true --batch-mode release:update-versions
Run Code Online (Sandbox Code Playgroud)

这正确地更新了我的所有子项目.但它没有更新projectB的依赖版本projectA.

什么是更新项目中所有开发版本的简单方法,包括projectB依赖于projectA

Ste*_*lly 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=...
Run Code Online (Sandbox Code Playgroud)

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

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