如何 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-d
和 aggregator-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
.
除此之外,使用 sed
或 maven-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。
结构
我知道这个项目结构不是 "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-d
和 aggregator-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
.
除此之外,使用 sed
或 maven-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
.
总而言之,我现在这样做(-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。