如何更新/修复单个子模块的父版本

Posted

技术标签:

【中文标题】如何更新/修复单个子模块的父版本【英文标题】:How to update/fix a single child module's parent version 【发布时间】:2020-06-16 22:12:55 【问题描述】:

结构

我知道这个项目结构不是“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(或激活的配置文件)&lt;modules&gt; 部分中列出的所有模块(在父级上使用 release:update-versions -DautoVersionSubmodules)。 但是,其余模块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 插件versions:set 失败,因为模块版本是由其父级定义的,versions:update-parent 不起作用,因为我无法指定新的父级版本(而是在远程存储库将被设置)并且versions:update-child-modules 告诉我所有子模块都是最新的(因为我们的想法是在引用我想要更新的模块的聚合器上运行它)。

其他想法

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

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

【问题讨论】:

您确定不能更改项目结构吗?您是否与您的经理谈过并解释说目前的结构很糟糕? 是的,至少不是短期的。我将尝试为此积压一项任务。我想我们可以例如使用配置文件而不是单独的聚合器(因此默认情况下父级不会定义任何模块,而是提供定义所需模块的配置文件“父级”、“聚合器-d”和“聚合器-t”)。 这听起来也不是一个好主意。如果你只想构建一两个模块,为什么不在命令行中指定它们呢? 我想至少它会解决我现在遇到的问题。这两个聚合器模块还指定了其他属性、插件和依赖项,因此如果可能的话,命令行将不是很实用(并且不会在 Git 存储库中进行跟踪)。 【参考方案1】:

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

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

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

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

幸好我发现remote存储库中不需要存在所需的版本,local存储库中存在就可以了。因此,在使用 versions:update-parent 之前,我为最终使一切正常工作所做的只是 mvn --non-recursive install 父 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。

【讨论】:

以上是关于如何更新/修复单个子模块的父版本的主要内容,如果未能解决你的问题,请参考以下文章

gitGit Submodule管理项目子模块

Xcode Bots 不会将 git 子模块更新为指定的提交

如何使用子进程模块杀死(或避免)僵尸进程

在父模块上执行 Maven 插件目标,但不在子模块上

windows下 python 子模块管理(安装,更新,卸载)

手把手教你把 Git 子模块更新到主项目