如何更新/修复单个子模块的父版本
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(或激活的配置文件)<modules>
部分中列出的所有模块(在父级上使用 release:update-versions -DautoVersionSubmodules
)。
但是,其余模块aggregator-d
和aggregator-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
。
除此之外,使用 sed
或 maven-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。
【讨论】:
以上是关于如何更新/修复单个子模块的父版本的主要内容,如果未能解决你的问题,请参考以下文章
Xcode Bots 不会将 git 子模块更新为指定的提交