0

结构

我知道这个项目结构不是“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-daggregator-t没有更新。

失败的尝试

所以我想我会单独更新剩余的模块,使用mvn --non-recursive,但到目前为止没有运气。

使用发布插件,我只设法更新了他们自己的版本,release:update-versions但是这不会更新引用的父版本,因此它会导致模块版本与父版本不同(发布添加了显式模块版本声明插入):

<parent>
  [...]
  <version>1.0.0-SNAPSHOT</version>
</parent>
<version>1.0.0-changed-SNAPSHOT</version> <- added by release plugin

使用版本插件失败,versions:set因为模块版本是由其父版本定义的,versions:update-parent不起作用,因为我无法指定新的父版本(而是将设置在远程存储库中找到的最新版本)并versions:update-child-modules告诉我所有子模块都已启动迄今为止(因为这个想法是在引用我想要更新的模块的聚合器上运行它)。

其他想法

Maven 命令在 Jenkins 声明性管道中执行,所以也许我可以尝试 (deprecated) writeMavenPom

除此之外,使用类似sedmaven-antrun-plugin用于正则表达式替换的东西,我已经没有想法了。

4

1 回答 1

0

阅读有关 Maven 插件版本的更多文档,我注意到它的参数newVersionversions:update-property

如果您想准确定义要使用的版本,您必须像这样使用它:-DnewVersion=[19.0]否则将使用较新的现有版本。

所以我将此信息应用于 的参数parentVersionversions:update-parent以及-DallowSnapshots。然后我收到了这个警告(虽然构建仍然成功):

[警告] 未更新版本:无法解析任何版本

幸运的是,我发现所需的版本不需要存在于远程存储库中,如果它存在于本地存储库中就可以了。所以我为最终使一切正常工作所做的只是mvn --non-recursive install在使用versions:update-parent.

总而言之,我现在这样做(-N--non-recursive${v}解析为例如1.0.0-changed-SNAPSHOT):

mvn -f parent release:update-versions -DautoVersionSubmodules -DdevelopmentVersion=${v}
mvn -f parent -N install
mvn -f parent/aggregator-d -N versions:update-parent -DallowSnapshots -DparentVersion=[${v}]
mvn -f parent/aggregator-t -N versions:update-parent -DallowSnapshots -DparentVersion=[${v}]

这个解决方案不是很漂亮,但我喜欢它而不是使用正则表达式或不推荐使用的 Jenkins API。

于 2020-03-05T08:44:51.710 回答