合并分支后编译如何保持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提交信息:
- 在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> - 修改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的文件并提交到版本库,合并后编译时读取该文件的值。
- 在原分支构建前,用
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> - 提交
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> - 修改finalName配置,读取文件中的build.number属性:
<finalName>${build.number}</finalName>
合并后编译时,会读取静态文件中的固定buildNumber,确保finalName不随编译时间变化。
内容的提问来源于stack exchange,提问作者Ciro
相关产品推荐
相关产品推荐

