You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并分支后编译如何保持Maven构建最终名称固定?

解决方案:保持合并分支后Maven构建的finalName不变

方案1:将buildNumber固化到pom.xml中

核心思路是把动态生成的buildNumber转为静态值并提交到版本库,合并后编译时直接使用该固定值,避免重新编译生成新时间戳。

  • 手动或通过CI工具在原分支构建前,替换pom.xml中buildNumber属性为具体固定值(如构建时的时间戳或Git commit哈希):
    <properties>
        <java.version>11</java.version>
        <maven.build.timestamp.format>yyyy-MM-dd-HH-mm-ss</maven.build.timestamp.format>    
        <buildNumber>${project.artifactId}-2024-05-20-14-30-00</buildNumber> <!-- 替换为实际构建时间戳 -->
    </properties>
    
  • 提交修改后的pom.xml到原分支,合并到目标分支后,编译时会直接使用这个固定的buildNumber,finalName保持不变。

若用CI自动化,可通过脚本在构建前替换pom.xml内容(示例用bash):

# 获取符合格式的时间戳
BUILD_TIMESTAMP=$(date +%Y-%m-%d-%H-%M-%S)
# 替换pom.xml中的buildNumber行
sed -i "s/<buildNumber>.*<\/buildNumber>/<buildNumber>${project.artifactId}-${BUILD_TIMESTAMP}<\/buildNumber>/g" pom.xml
# 提交修改(需CI具备代码提交权限)
git add pom.xml
git commit -m "Update buildNumber to ${BUILD_TIMESTAMP}"

方案2:使用Git Commit哈希作为buildNumber核心标识

Git commit哈希唯一且固定,同一个commit在任意分支编译时哈希值一致,可确保finalName不变。

需借助maven-git-commit-id-plugin获取Git提交信息:

  1. 在pom.xml的build/plugins中添加插件:
    <plugin>
        <groupId>pl.project13.maven</groupId>
        <artifactId>git-commit-id-plugin</artifactId>
        <version>4.9.1</version>
        <executions>
            <execution>
                <id>get-git-info</id>
                <goals>
                    <goal>revision</goal>
                </goals>
                <phase>initialize</phase>
            </execution>
        </executions>
        <configuration>
            <generateGitPropertiesFile>true</generateGitPropertiesFile>
            <includeOnlyProperties>
                <includeOnlyProperty>git.commit.id.abbrev</includeOnlyProperty>
            </includeOnlyProperties>
        </configuration>
    </plugin>
    
  2. 修改buildNumber定义,用commit哈希替代时间戳:
    <properties>
        <java.version>11</java.version>    
        <buildNumber>${project.artifactId}-${git.commit.id.abbrev}</buildNumber>
    </properties>
    

后续无论在哪个分支编译同一个commit,git.commit.id.abbrev都会返回相同的短哈希,生成的finalName保持一致。

方案3:通过静态文件存储buildNumber

在原分支构建时生成包含固定buildNumber的文件并提交到版本库,合并后编译时读取该文件的值。

  1. 在原分支构建前,用maven-antrun-plugin自动生成src/main/resources/build-info.properties:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>3.1.0</version>
        <executions>
            <execution>
                <phase>initialize</phase>
                <goals>
                    <goal>run</goal>
                </goals>
                <configuration>
                    <tasks>
                        <echo file="src/main/resources/build-info.properties">
                            build.number=${project.artifactId}-${maven.build.timestamp}
                        </echo>
                    </tasks>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
  2. 提交build-info.properties到原分支,合并后在pom.xml中用maven-resources-plugin读取该文件属性:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.3.1</version>
        <executions>
            <execution>
                <id>read-build-info</id>
                <phase>initialize</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                    <resources>
                        <resource>
                            <directory>src/main/resources</directory>
                            <includes>
                                <include>build-info.properties</include>
                            </includes>
                            <filtering>true</filtering>
                        </resource>
                    </resources>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
  3. 修改finalName配置,读取文件中的build.number属性:
    <finalName>${build.number}</finalName>
    

合并后编译时,会读取静态文件中的固定buildNumber,确保finalName不随编译时间变化。

内容的提问来源于stack exchange,提问作者Ciro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:07:05