如何处理apache ant中的错误?

时间:2015-07-14 04:10:41

标签: ant

我依次按顺序呼叫蚂蚁目标。如果一个目标失败,我想继续序列中的下一个目标。怎么做?

目前,我使用 antcall 任务调用目标。

仅供参考 - 每个目标使用 taskdef 调用java类。这个java类可以抛出异常。

请建议。

注意: - 我不能使用任何其他第三方罐子,如ant-contrib等。

2 个答案:

答案 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划分为多个构建文件(另一个禁止 - 否),然后手动使用antantcall任务来构建。结果是在构建过程中一些目标被调用多达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"任务添加参数javacfailonerror="false"