我知道这个项目结构不是“ Maven方式”,这就是为什么我首先要努力。不幸的是,我无法更改项目结构。
我尝试尽可能简化它:
/module-a
/module-b
/module-c
/parent <- <parent>master</parent>, <modules>module-a, module-b, module-c</modules>
/parent/aggregator-d <- <parent>parent</parent>, <modules>module-a, module-b</modules>
/parent/aggregator-t <- <parent>parent</parent>, <modules>module-a</modules>
所有模块的版本应更改为给定版本。除了父模块之外,没有模块明确定义其版本,因此仅父版本必须更改。但是,由于在所有其他模块中都引用了父版本,因此必须对其进行相应的更新。
对于父POM(或已激活的配置文件)的release:update-versions -DautoVersionSubmodules
部分中列出的所有模块,此功能都很好(使用父级上的<modules>
)。但是,其余模块aggregator-d
和aggregator-t
未更新。
所以我想我将使用mvn --non-recursive
单独更新其余模块,但到目前为止还算运气。
使用release plugin,我只能使用mvn --non-recursive
来更新其own版本,但是这不会更新所引用的父版本,因此导致模块版本不同于父版本版本(显式模块版本声明已由发布插件添加):
release:update-versions
使用版本插件,release:update-versions
失败,因为模块版本由其父版本定义,<parent>
[...]
<version>1.0.0-SNAPSHOT</version>
</parent>
<version>1.0.0-changed-SNAPSHOT</version> <- added by release plugin
不起作用,因为我无法指定新的父版本(相反,在远程存储库中找到的最新版本将被设置),versions:set
告诉我所有子模块都是最新的(因为该想法是在引用我要更新的模块的聚合器上运行它)。
Maven命令在Jenkins声明性管道中执行,所以也许我可以尝试(不建议使用的versions:set
。
除此之外,使用versions:update-parent
或versions:update-parent
之类的东西进行正则表达式替换,我的想法已经用完了。
阅读有关Maven插件的更多文档,我注意到versions:update-child-modules
的参数versions:update-child-modules
表示:
如果要精确定义要使用的版本,则必须像这样使用它:
writeMavenPom
否则将使用较新的现有版本。
所以我将此信息与writeMavenPom
一起应用于了sed
的参数maven-antrun-plugin
。然后,我得到了这个警告(虽然构建仍然成功):
[[警告]未更新版本:无法解析任何版本
幸运的是,我不需要所需的版本存在于remote存储库中,如果它存在于local存储库中就可以了。因此,我最终使所有工作正常进行的工作只是在使用newVersion
之前是[P0]父POM。
总而言之,我现在要这样做(versions:update-property
是versions:update-property
,-DnewVersion=[19.0]
解析为例如parentVersion
):
versions:update-parent
此解决方案不是很好,但是我更喜欢使用正则表达式或不推荐使用的Jenkins API。