如何在Maven项目中动态传递父POM的version版本号
问题原因
Maven对<parent>标签内的版本号解析发生在构建生命周期的最早期阶段,此时普通的自定义系统属性、环境变量还未被加载到项目属性上下文,因此直接在<version>标签内使用${myversion}、${env.myversion}这类变量无法正常解析。
解决方案
方案1:使用Maven内置CI友好变量(推荐,适用于Maven 3.5.0及以上版本)
Maven 3.5.0之后专门提供了${revision}、${sha1}、${changelist}三个可提前解析的特殊变量,用于这类动态版本场景。
- 调整parent标签写法:
<parent> <groupId>com.maventest</groupId> <artifactId>myproject</artifactId> <version>${revision}</version> </parent>
- 执行Maven命令时通过参数传入版本即可:
mvn clean install -Drevision=1.0.0-SNAPSHOT
方案2:搭配flatten-maven-plugin使用自定义变量(适用于低版本Maven场景)
如果你的Maven版本低于3.5.0,可通过flatten插件在构建过程中替换变量:
- 在当前项目的pom.xml中添加插件配置:
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>flatten-maven-plugin</artifactId> <version>1.5.0</version> <executions> <execution> <id>flatten</id> <phase>process-resources</phase> <goals> <goal>flatten</goal> </goals> </execution> <execution> <id>flatten.clean</id> <phase>clean</phase> <goals> <goal>clean</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- parent标签内直接使用自定义变量:
<parent> <groupId>com.maventest</groupId> <artifactId>myproject</artifactId> <version>${myversion}</version> </parent>
- 执行命令时传入参数即可:
mvn clean install -Dmyversion=1.0.0-SNAPSHOT
注意事项
如果需要将当前项目打包上传到Maven私服/中央仓库,必须配置flatten插件,否则上传的pom文件会保留变量标识,其他项目依赖该组件时会出现版本解析失败的问题。
内容的提问来源于stack exchange,提问作者sparta
相关产品推荐
相关产品推荐

