我依次按顺序呼叫蚂蚁目标。如果一个目标失败,我想继续序列中的下一个目标。怎么做?
目前,我使用 antcall 任务调用目标。
仅供参考 - 每个目标使用 taskdef 调用java类。这个java类可以抛出异常。
请建议。
注意: - 我不能使用任何其他第三方罐子,如ant-contrib等。
答案 0 :(得分:1)
目前我使用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查看我的依赖矩阵。它意识到它需要运行compile
目标才能运行package
,然后意识到它需要在generate-source
之前运行compile
。因此,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
属性的设置,并允许程序在编译器错误时继续。
答案 1 :(得分:0)
您可以继续执行忽略失败的任务,而不是尝试跳过目标。
对于例如taskdef
,您可以尝试为onerror="ignore"
任务添加参数javac
,failonerror="false"