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+ 支持省略 )。
注意
如果省略子模块的 ,需确保父 POM 的 是固定的(不能是 ${revision} 等动态变量)。


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
posted @ 2025-09-03 17:13  蓝迷梦  阅读(57)  评论(0)    收藏  举报