Ant 目标可以有一个可选的if 或unless 子句。这意味着只有在使用if 子句设置属性或使用unless 子句1 未设置属性时才执行任务。有趣的是,if 或 unless 子句在任何依赖任务第一次执行后检查。
这意味着,您可以在标准 Ant 中执行此操作,作为仅在满足特定条件时执行 Ant 任务的一种方式:
<target name="test.if.tomcat.is.running">
<condition property="tomcat.running">
<socket server="${tomcat.host}" port="${tomcat.port}"/>
</condition>
</target>
<target name="my.target"
if="tomcat.running"
depends="test.if.tomcat.is.running">
<yaddah/>
<yaddah/>
<yaddah/>
</target>
您指定希望 Ant 执行 Target my.target。 Ant 注意到 my.target 依赖于 test.if.tomcat.is.running 目标,并将首先执行该目标。如果 Tomcat 实际正在运行,test.if.tomcat.is.running 任务将设置 tomcat.running 属性。否则,不设置该属性。
最后,Ant 会回到my.target 目标,查看是否设置了属性tomcat.running,如果设置了则只会执行目标my.target。
或者,您可以使用 Ant-contrib 任务,这可以使您的整个构建过程更容易理解。
如果你想走 Ant-Contrib 路线,有一个简单的方法来设置 Ant-Contrib,所以 Ant-contrib jar 实际上是你项目的一部分。如果有人从版本控制系统中签出您的项目,他们也会获得 Ant-contrib jar,因此不必自己安装 Ant-Contrib。
下载 Ant-Contrib jar,并将其放入项目根目录中名为 antlib/ac 的目录中。 antlib 可用于各种可选任务 jar,例如 Findbugs 或 PMD。只需将每个可选的 Ant jar 放在 antlib 下自己的目录中(就像我将 Ant-Contrib 放在 ac 目录下一样)。
然后,在您的 build.xml 中,您以这种方式指定 Ant-Contrib 任务:
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<fileset dir="${basedir}/antlib/ac"/>
</classpath>
</taskdef>
现在,您可以使用 Ant-Contrib 任务,而不必担心它们是否安装在特定机器上。您签出您的项目,并且您可以自动访问这些任务。
1. 没错,if/unless 子句检查是否设置了属性,而不是 true/false,这会引起很多混乱。我看到开发人员将属性设置为false 或no,然后想知道为什么目标实际上正在执行,因为if 子句设置为false。