如何在Ant项目war文件的manifest中写入当前GIT分支信息
Ant构建将Git分支信息写入WAR包Manifest实现方案
不需要引入第三方Ant扩展包,用Ant原生任务+本地Git命令就能实现,配置分三步:
- 拉取当前Git分支名存入Ant属性
优先用Git原生命令获取分支名,同时做容错处理,避免非Git环境、没装Git客户端时构建直接失败:
<!-- 给Git分支属性设默认值,异常场景下兜底 --> <property name="git.branch" value="unknown"/> <!-- 调用git命令获取当前检出的分支名 --> <exec executable="git" outputproperty="git.branch" failifexecutionfails="false" errorproperty="git.cmd.error"> <arg value="rev-parse"/> <arg value="--abbrev-ref"/> <arg value="HEAD"/> </exec> <!-- 清理命令输出带的换行、首尾空白字符,避免写入Manifest的内容带乱码 --> <loadresource property="git.branch"> <string value="${git.branch}"/> <filterchain> <trim/> <striplinebreaks/> </filterchain> </loadresource>
- 动态生成带Git信息的Manifest文件
不用提前手写MANIFEST.MF,构建时动态生成即可,除了Git分支还可以按需加提交ID、构建时间、版本号等自定义字段:
<target name="generate-manifest"> <manifest file="${build.dir}/META-INF/MANIFEST.MF"> <attribute name="Manifest-Version" value="1.0"/> <attribute name="Created-By" value="Ant ${ant.version}"/> <!-- 写入Git分支自定义属性 --> <attribute name="Git-Branch" value="${git.branch}"/> <!-- 按需追加其他属性,比如Git提交哈希、构建时间等 --> </manifest> </target>
- 打包WAR时引用自定义Manifest
配置war任务时指定我们生成的Manifest文件,替换war任务默认生成的空白Manifest即可,原有war包的资源配置(classes、lib、前端资源等)不需要改动:
<target name="package-war" depends="compile, generate-manifest"> <war destfile="${output.dir}/your-app.war" webxml="${web.root}/WEB-INF/web.xml"> <!-- 关联带Git信息的Manifest --> <manifest file="${build.dir}/META-INF/MANIFEST.MF"/> <!-- 原有资源配置保持不变 --> <classes dir="${build.dir}/classes"/> <lib dir="${dependency.lib.dir}"/> <fileset dir="${web.root}"/> </war> </target>
构建验证:打包完成后解压war包,查看
META-INF/MANIFEST.MF文件,就能看到Git-Branch: 你的分支名的条目。如果是CI环境构建,没有预装Git客户端的话,可以直接读取CI系统预置的分支环境变量(比如GitHub Actions的GITHUB_REF_NAME、GitLab CI的CI_COMMIT_BRANCH),替换掉exec拉取分支的逻辑即可,稳定性更高。
顺带提一句你之前遇到的Maven场景下buildnumber-maven-plugin无法写入war包的问题,不是插件不支持war,是没有把插件生成的buildNumber属性绑定到maven-war-plugin的manifestEntries配置里,给war插件加对应配置就能实现和jar包一致的写入效果。
内容的提问来源于stack exchange,提问作者philb
相关产品推荐
相关产品推荐

