Apache Ant:如何处理目标错误并按需触发部署报告?
问题
我们使用如下Ant target部署应用并执行部署后任务,该target用于部署多个应用。部分target的failOnError属性设为false,其余设为true。部署完成后需发布应用部署报告,标注每个应用的部署成败:
- 对于
failOnError设为false的target,我们可接受其失败; - 但当
failOnError设为true的target失败时,希望触发deployment.report这类target。
请问能否在deploy target层面识别上述第2种情况的错误,并执行deployment.report target?
原Ant代码:
<target name="deploy" depends="upload.jar, create.app, disable.features, enable.features, provision.features, edit.properties, wire.application, distribute.app, deploy.app, start.app"> </target> <target name="deployment.report"> <!-- execute java code here to update deployment report csv file --> </target>
解决方案
可以实现,核心是追踪failOnError=true的关键target执行状态,再在deploy层面根据状态触发报告。以下是几种可行方案:
方案1:使用Ant Contrib的trycatch任务(推荐)
如果环境允许引入Ant Contrib扩展,这是最灵活的方式——通过trycatch包裹每个关键target,捕获失败后标记状态,最后统一判断是否执行报告。
步骤如下:
- 引入Ant Contrib任务定义:
<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
- 修改
deploytarget添加状态管控:
<target name="deploy"> <!-- 初始化状态标记:默认无关键错误 --> <property name="critical.failed" value="false"/> <!-- 对每个failOnError=true的target,用trycatch包裹捕获错误 --> <trycatch> <try> <antcall target="upload.jar"/> <!-- 假设此target failOnError=true --> </try> <catch> <!-- 标记关键错误发生 --> <property name="critical.failed" value="true"/> </catch> </trycatch> <!-- 对其他failOnError=true的target(如create.app、deploy.app等)重复上述逻辑 --> <!-- 关键错误发生时触发报告 --> <antcall target="deployment.report" if="critical.failed"/> </target>
这种方式无需修改原有target内部逻辑,仅在deploy层面做状态管控,精准控制报告触发时机。
方案2:修改关键target的内部逻辑
如果无法引入第三方扩展,可以直接修改每个failOnError=true的target,添加失败状态标记:
- 修改关键target(以
upload.jar为例):
<target name="upload.jar" failOnError="false"> <!-- 原有部署逻辑 --> <echo message="Executing upload.jar deployment..."/> <!-- 任务失败时标记状态,可选是否终止后续任务 --> <fail message="upload.jar deployment failed" unless="upload.success"/> <property name="critical.failed" value="true" unless="upload.success"/> </target>
- 在
deploytarget末尾添加报告触发逻辑:
<target name="deploy" depends="upload.jar, create.app, ..."> <antcall target="deployment.report" if="critical.failed"/> </target>
该方案需要逐个修改关键target,灵活性稍差,但无需依赖外部扩展。
方案3:自定义Ant BuildListener(进阶)
如果需要更底层的状态追踪,可以编写Java代码实现org.apache.tools.ant.BuildListener,监听每个target的执行结果,自动记录failOnError=true的target失败情况,最后在build结束时触发报告。这种方式适合复杂多应用部署场景,但需要额外编写Java代码。
内容的提问来源于stack exchange,提问作者Ranjeet
相关产品推荐
相关产品推荐

