最好的方法是将 Ant-Contrib jarfile 放入您的项目中。例如,假设build.xml 位于项目的根目录中。在您的项目中创建一个名为ant.lib\ant-contrib 的目录,然后将ant-contrib*.jar 放在此文件夹中。您可以将此方法用于您可能需要的其他可选 Ant 任务(例如,Ivy、Findbugs、Cobrrtura 等)。
然后,在您的 build.xml 文件中,您可以这样做:
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<fileset dir="${basedir}/ant.lib/ant-contrib"/>
</classpath>
</taskdef>
我喜欢这样做,因为项目中包含了带有任务的可选 jar。如果您将所有内容都签入您的版本控制系统,那么有人可以签出您的代码并进行构建,而无需下载 Ant-Contrib 并自行安装。
您可以定义一个 XML 命名空间。这为您的 Ant-Contrib 任务提供了一个前缀,以避免在您使用具有相同任务名称的其他可选 ant 任务时发生任务名称冲突。另外,它会提醒用户这不是标准的 Ant 任务。
如果您使用 XML 命名空间,则需要在 <project> 标题中添加 XMLNS 声明。这将包含一个 URI,它将您的 Ant Contrib 任务连接到您的 XML 命名空间。例如,ac: 命名空间适用于所有 Ant Contrib 任务:
<project name="my.project" default="package" basedir="."
xmlns:ac="http://ant-contrib.sourceforge.net">
<taskdef resource="net/sf/antcontrib/antlib.xml"
uri="http://ant-contrib.sourceforge.net">
<classpath>
<fileset dir="${basedir}/ant.lib/ant-contrib"/>
</classpath>
</taskdef>
这样做的目的是将 ac 的 XML 命名空间 (xmlns) 与 URI http://ant-contrib.sourceforge.net 匹配。 URI 可以是任何东西。例如:
<project name="my.project" default="package" basedir="."
xmlns:ac="hamburger:with-fries">
<taskdef resource="net/sf/antcontrib/antlib.xml"
uri="hamburger:with-fries">
<classpath>
<fileset dir="${basedir}/ant.lib/ant-contrib"/>
</classpath>
</taskdef>
标准是使用类似antlib:net.sf.antcontrib:
<project name="my.project" default="package" basedir="."
xmlns:ac="antlib:net.sf.antcontrib">
<taskdef resource="net/sf/antcontrib/antlib.xml"
uri="antlib:net.sf.antcontrib">
<classpath>
<fileset dir="${basedir}/ant.lib/ant-contrib"/>
</classpath>
</taskdef>
但是,我喜欢使用项目的 URL。这样,如果有人想要关于 Ant-Contrib 任务的文档,他们就会知道 Ant-Contrib 项目所在的 URL。
在上述所有三种情况下,我都使用ac 定义了 XML 命名空间。因此,您必须在所有 Ant-Contrib 任务名称前加上 ac:。你可以使用antcontrib 或任何你喜欢的。使用 ac: 命名空间,您的 Ant-contrib 任务将如下所示:
<ac:if>
<istrue value="${include.debug.code}"/>
<ac:then>
[...]
</ac:then>
<ac:else>
[...]
</ac:else>
<ac:if>
如果你跳过整个命名空间的事情,你可以简单地使用 Ant-Contrib 任务记录:
<if>
<istrue value="${include.debug.code}"/>
<then>
[...]
</then>
<else>
[...]
</else>