如何在不更新子模块的前提下更新父/聚合POM版本?
问题场景
我有一个多模块Maven项目,父POM结构如下:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>my-parent</artifactId> <version>0.1.0</version> <modules> <module>module1</module> <module>module2</module> <!-- etc. --> </modules> </project>
子模块的POM结构示例:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>module1</artifactId> <version>0.1.0</version> <parent> <groupId>com.example</groupId> <artifactId>my-parent</artifactId> <version>0.1.0</version> </parent> </project>
我需要仅更新父POM的版本到0.2.0-SNAPSHOT,但保持子模块中<parent>节点引用的父版本仍为0.1.0。尝试过mvn versions:set搭配各种参数(包括-N标志)都没成功,想知道能不能用versions插件实现,或者有没有其他自动化的命令/插件方法(不能手动编辑POM)。
解决方案
方法1:使用versions插件的限定参数
直接在父POM所在目录执行以下命令:
mvn versions:set -DnewVersion=0.2.0-SNAPSHOT -N -DprocessAllModules=false
-N:仅针对当前父POM执行命令,不递归处理子模块-DprocessAllModules=false:强制插件只修改当前POM的版本,避免联动更新子模块中的父版本引用
部分旧版本的versions插件在-N模式下仍会默认处理子模块的父节点引用,加上这个参数就能完全限定修改范围。
方法2:命令行文本替换(跨平台可选)
如果versions插件的方法仍不生效,可直接用文本替换工具修改父POM:
Linux/macOS(sed命令)
sed -i '' 's/<version>0.1.0<\/version>/<version>0.2.0-SNAPSHOT<\/version>/g' pom.xml
Windows(PowerShell命令)
(Get-Content pom.xml) -replace '<version>0.1.0</version>', '<version>0.2.0-SNAPSHOT</version>' | Set-Content pom.xml
这种方式直接定位父POM的版本节点替换,完全不会影响子模块文件。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

