所有taskdef都会将任务名称到包含执行该任务的代码的类文件。但是,为了找到该类文件,您需要告诉<taskdef/>
在哪里可以找到包含它的jar。这就是所有的类路径。
您不必定义类路径与<taskdef/>
任务。默认情况下,Ant会在$ANT_HOME/lib
中查找包含代码<taskdef/>
任务的所有jar。如果您将jar复制到该文件夹,则可以简单地使用这种方式定义该任务:
<taskdef name="antTask" classname="def.RepairTask"/>
不需要类路径。但是,我实际上不建议这样做。相反,我建议把该JAR文件到您的项目,让其他开发人员可以使用您的项目,而不需要那个任务jar包安装到他们的$ANT_HOME/lib
文件夹:
<taskdef name='antTask' classname="def.RepairTask">
<classpath>
<fileset dir="${basedir}/antlib/antjar"/>
</classpath>
</taskdef>
现在,当开发人员检查出该项目需要的可选的任务jar,该任务jar附带了该项目,所以他们可以简单地构建它们。
有两种方法来定义任务。一个是给一个任务一个名字,然后告诉<taskdef/>
什么类文件与那个jar相关联,就像你上面做的那样。但是,您也可以定义一个资源,该资源也会将任务名称与其类相关联。下面是包括Ant-Contrib ant tasks一种常见的方式:
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<fileset dir="${basedir}/antlib/antcontrib"/>
</classpath>
</taskdef>
如果我扩大antcontrib罐子,我会看到它包含了罐子里面net/sf/antcontrib/antcontrib.properties
文件。该文件看起来像这样:
...
# Logic tasks
if=net.sf.antcontrib.logic.IfTask
foreach=net.sf.antcontrib.logic.ForEach
throw=net.sf.antcontrib.logic.Throw
trycatch=net.sf.antcontrib.logic.TryCatchTask
switch=net.sf.antcontrib.logic.Switch
outofdate=net.sf.antcontrib.logic.OutOfDate
runtarget=net.sf.antcontrib.logic.RunTargetTask
timestampselector=net.sf.antcontrib.logic.TimestampSelector
antcallback=net.sf.antcontrib.logic.AntCallBack
antfetch=net.sf.antcontrib.logic.AntFetch
assert=net.sf.antcontrib.logic.Assert
relentless=net.sf.antcontrib.logic.Relentless
# Math Tasks
math=net.sf.antcontrib.math.MathTask
...
它所做的就是用每个任务的类文件来定义每个任务。我会建议你做一些类似于你的自定义蚂蚁任务。这样,如果您决定包含其他任务,则可以简单地修改这一个文件,开发人员不必在其jar包中更改其定义,或者添加多个。
顺便说一下,您应该确保您的课程不会与其他课程可能会使用的课程冲突。你可能想给你的类名的完整路径,其中包括独特的前缀:
<taskdef name='antTask' classname="com.vegicorp.anttasks.RepairTask">
假设你VegiCorp工作...
蚂蚁的contrib任务包含两个这样的文件。一种是XML格式,另一种是属性格式。我总是使用XML格式,这就是您在定义Ant任务资源时应该使用的内容。我使用了属性文件,因为它是一个更简单的格式,更容易看到发生了什么。
你可以从Ant发布整个错误消息吗?我怀疑你正在引用第三方JAR(如Apache StringUtils),在你使用自定义Ant任务的后续项目中,你可能没有参考它。 –
taskdef无法找到类def.RepairTask所需的类:org/apache/commons/io/input/BOMInputStream使用类加载器AntClassLoader [C:... \ antTask.jar]。是的,它是第三方库。但它包含在生成的antTask.jar中,当我使用eclipse运行ant build.xml时(我编辑运行配置并添加缺少的apache jar),一切都正常工作,但我真的想现在怎么写这下到build.xml中,所以它将在没有日食的情况下工作 – yaay