我按顺序一个接一个地调用蚂蚁目标。如果一个目标失败了,我想继续进行序列中的下一个目标。如何做到这一点?
目前我使用antcall任务调用目标。
供参考-每个目标调用java类使用taskdef。这个java类可以抛出异常。
请建议。
注意:-我不能使用任何其他第三方jar,如ant-contrib等。
当前我使用antcall任务调用目标。
不要使用antcall
。构建文件不是程序。它们是相关矩阵。您可以让Ant决定调用哪些目标以及调用的顺序。例如,我有一个名为package
的目标,它取决于我的代码在目标compile
中编译。compile
目标取决于在目标generate-source
中生成的源代码。我的build.xml
看起来像这样:
<project default="package" name="my.proj">
...
<target name="generate-source">
...
</target>
<target name="compile" depends="generate-source">
...
</target>
<target name="package" depends="compile">
...
</target>
</project>
当我说:
$ ant package
Ant查看我的依赖矩阵。它意识到在运行package
之前需要运行compile
目标,然后意识到在运行compile
之前需要运行generate-source
。因此,Ant将按照以下顺序自动运行目标:
-
generate-source
-
compile
-
package
注意,我不必说package
依赖于目标generate-source
。相反,我所要做的就是指定主依赖项,Ant将自己计算出其他后续依赖项。
使用antcall
强制排序有什么问题?因为我可能会弄错。如果我的build.xml
改变了怎么办?我现在必须检查并验证我的整个文件,看看我的antcall
任务是否仍然正确。此外,在更复杂的构建文件中,您可能会一遍又一遍地调用相同的任务。
在我来之前,我们有一个开发人员编写我们的build.xml
文件。在一次构建中,他将build.xml
划分为多个构建文件(另一个禁忌),然后手动使用ant
和antcall
任务进行构建。结果是一些目标在构建过程中被调用多达15次,并且一个构建需要20多分钟才能完成,因为一个特定的目标被一次又一次地调用(并且每个目标将删除由前一次调用生成的工件)。重写构建文件将构建过程缩短到仅仅4分钟。
作为奖励,每个目标都可以被调用和工作。例如,开发人员可以调用compile
目标而不必构建整个包——在调试代码时能够这样做是很好的。此外,不要将任何清理过程作为正常构建步骤的一部分。相反,使用一个clean
目标来删除所有生成的工件。将构建工件作为正常构建过程的一部分删除可能会减慢调试速度。如果开发人员需要一个干净的石板,他们可以运行clean
目标。
作为原始查询的答案,几乎所有的任务都可以设置为忽略错误并继续。我建议使用属性,可以设置为覆盖默认设置:
<property name="halt.on.error" value="true"/>
<target name="compile" ...>
<javac ...
failonerror="${halt.on.error}"
.../>
....
</target>
如果我运行:
$ ant
生成将在出现编译错误时停止。但是,如果我运行:
$ ant -Dhalt.on.error="false"
这将覆盖构建文件本身的halt.on.error
属性的设置,并允许程序在编译器错误时继续运行。
与其尝试跳过目标,不如忽略失败继续任务。
对于taskdef
,您可以尝试包含参数onerror="ignore"
对于javac
任务,您可以包含failonerror="false"