如何 update/fix 单个子模块的父版本

How to update/fix a single child module's parent version

结构

我知道这个项目结构不是 "the Maven way",这就是我一开始就纠结的原因。很遗憾,我无法更改项目结构。

我尽量简化:

/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(或激活的配置文件)的 <modules> 部分中列出的所有模块,这工作正常(在父级上使用 release:update-versions -DautoVersionSubmodules)。 但是,其余模块 aggregator-daggregator-t 未更新。

尝试失败

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

使用 release 插件,我只使用 release:update-versions 更新了他们的 own 版本,但这并没有更新引用的父版本,因此导致模块版本与父版本不同(显式模块版本声明已由发布插件添加):

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

使用 版本插件 versions:set fails because the module version is defined by its parent, versions:update-parent does not work because I cannot specify the new parent version (instead the newest version found in the remote repository will be set) and versions:update-child-modules 告诉我所有子模块都是最新的(因为我的想法是 运行 它在聚合器上它引用了我想要更新的模块)。

其他想法

Maven 命令在 Jenkins 声明式管道中执行,所以也许我可以尝试(已弃用)writeMavenPom.

除此之外,使用 sedmaven-antrun-plugin 之类的东西来替换正则表达式,我 运行 没主意了。

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

If you like to define the version to be used exactly you have to use it like this: -DnewVersion=[19.0] otherwise a newer existing version will be used.

所以我把这个信息应用到versions:update-parent的参数parentVersion,连同-DallowSnapshots。然后我收到了这个警告(虽然构建仍然成功):

[WARNING] Not updating version: could not resolve any versions

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

之前的父 POM

总而言之,我现在这样做(-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。