maven版本控制
在 Maven 项目中,可以通过 JVM 参数(-D) 在构建时动态传递版本号,结合 Maven 属性(<properties>) 或 资源过滤(Resource Filtering) 实现灵活的版本管理。以下是具体方法:
1. 方法一:通过 -D 覆盖 Maven 属性
Maven 允许通过 -D 参数覆盖 pom.xml 中定义的属性(<properties>),包括版本号。
步骤
(1) 在 pom.xml 中定义版本属性
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<!-- 定义版本属性(默认值) -->
<properties>
<app.version>1.0.0-SNAPSHOT</app.version>
</properties>
<!-- 使用版本属性 -->
<version>${app.version}</version>
<!-- 其他配置... -->
</project>
(2) 通过 -D 传递版本号
在构建时覆盖 app.version:
mvn clean install -Dapp.version=2.0.0-RELEASE
- Maven 会使用
2.0.0-RELEASE替代pom.xml中的默认值1.0.0-SNAPSHOT。
适用场景
- CI/CD 流水线:动态传递版本号(如
1.0.0-${BUILD_NUMBER})。 - 本地调试:快速切换版本号测试。
2. 方法二:结合 flatten-maven-plugin(推荐)
如果需要将动态版本号写入最终的 pom.xml(例如发布到 Nexus 仓库),可以使用 flatten-maven-plugin 在构建时替换变量。
步骤
(1) 配置 flatten-maven-plugin
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<updatePomFile>true</updatePomFile> <!-- 修改原始 pom.xml -->
<flattenMode>resolveCiFriendliesOnly</flattenMode> <!-- 仅替换 ${revision} 等变量 -->
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
(2) 使用 ${revision} 定义版本
<properties>
<revision>1.0.0-SNAPSHOT</revision> <!-- 默认版本 -->
</properties>
<version>${revision}</version>
(3) 通过 -D 传递版本号
mvn clean install -Drevision=2.0.0-RELEASE
- 插件会将
${revision}替换为2.0.0-RELEASE,并生成一个扁平化的pom.xml.flatten文件(实际修改原始pom.xml如果配置了updatePomFile=true)。
优点
- 生成的 POM 文件包含实际版本号,适合发布到仓库。
- 支持 CI/CD 动态版本(如
1.0.0-${GIT_COMMIT_HASH})。
3. 方法三:通过 versions-maven-plugin 批量修改版本
如果需要在构建前批量修改版本号(而非动态传递),可以使用 versions-maven-plugin。
步骤
(1) 配置插件
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.16.0</version>
</plugin>
(2) 通过 -D 指定新版本
mvn versions:set -DnewVersion=2.0.0-RELEASE
- 此命令会修改所有模块的
pom.xml文件,需提交到 Git。
适用场景
- 手动升级项目版本(非动态传递)。
4. 方法四:通过资源过滤(Resource Filtering)写入配置文件
如果需要将版本号写入应用的配置文件(如 application.properties),可以结合 resource filtering 和 -D 参数。
步骤
(1) 在 pom.xml 中启用资源过滤
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- 启用变量替换 -->
</resource>
</resources>
</build>
(2) 在配置文件中引用版本属性
src/main/resources/application.properties:
app.version=${project.version}
(3) 通过 -D 传递版本号
mvn clean package -Dapp.version=2.0.0-RELEASE
- 构建后,
application.properties中的${project.version}会被替换为2.0.0-RELEASE。
注意
- 此方法仅影响资源文件,不会修改
pom.xml中的<version>。
5. 实现版本号“继承”
使用
在父 POM 中定义版本号为变量,子模块通过 ${project.parent.version} 引用。
步骤
- 父 POM (pom.xml):
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version> <!-- 父POM版本 -->
<packaging>pom</packaging> <!-- 必须是pom -->
<properties>
<!-- 定义公共版本变量(可选) -->
<main.version>1.0.0</main.version>
</properties>
</project>
- 子模块 (child-module/pom.xml):
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version> <!-- 必须与父POM版本一致 -->
</parent>
<artifactId>child-module</artifactId>
<!-- 方式1:直接省略<version>(需Maven 3.5.0+) -->
<!-- 方式2:显式引用父版本 -->
<version>${project.parent.version}</version>
<!-- 或使用父POM中定义的变量 -->
<version>${main.version}</version>
</project>
优点
版本号集中管理在父 POM 中。
子模块无需重复定义版本(Maven 3.5.0+ 支持省略
注意
如果省略子模块的
6. 完整示例
pom.xml 配置
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<properties>
<!-- 默认版本 -->
<app.version>1.0.0-SNAPSHOT</app.version>
</properties>
<version>${app.version}</version>
<build>
<plugins>
<!-- 可选:flatten-maven-plugin -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<updatePomFile>true</updatePomFile>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
构建命令
# 动态传递版本号
mvn clean install -Dapp.version=2.0.0-RELEASE
总结
| 方法 | 适用场景 | 是否修改 pom.xml |
是否支持 CI/CD |
|---|---|---|---|
-D 覆盖属性 |
简单动态版本 | ❌(仅运行时覆盖) | ✅ |
flatten-maven-plugin |
发布到仓库 | ✅(生成扁平化 POM) | ✅ |
versions-maven-plugin |
批量升级版本 | ✅(修改文件) | ❌(需提交 Git) |
| 资源过滤 | 写入配置文件 | ❌(仅资源文件) | ✅ |
| 父子模块继承 | 不修改 | ❌(可以运行时统一修改父bom中的版本信息) | ✅ |
推荐方案
- CI/CD 动态版本:使用
flatten-maven-plugin+-Drevision。 - 本地调试:直接通过
-Dapp.version覆盖。 - 批量升级:使用
versions-maven-plugin。
本文来自博客园,作者:蓝迷梦,转载请注明原文链接:https://www.cnblogs.com/hewei-blogs/articles/19072135

浙公网安备 33010602011771号