带有其他库的自定义ant任务

时间:2014-02-27 14:46:19

标签: java ant jar

我正在为java编写一个自定义任务,我的想法是我可以给某人.jar包含类文件和库的java文件以及ant的build.xml,他可以使用它。 / p>

如果我导出我的java项目,.jar(antTask.jar)包含: 已编译类的文件夹,一个用于库,meta-inf文件夹和.classpath .project文件

ant build.xml如下所示:

<?xml version="1.0" ?>
<project name="repair" basedir="." default="repairTask">    
<taskdef name="antTask" classpath="antTask.jar" classname="def.RepairTask"/>
<target....

我真的不了解所有这些类路径的东西,所以有人可以告诉我我必须在构建文件中添加什么,所以它只适用于没有java代码源的.jar文件吗?

现在我收到一个错误,蚂蚁找不到我在java代码中使用的一个库有这个错误(但是antTask.jar包含这个lib作为另一个.jar):

taskdef A class needed by class def.RepairTask cannot be found: org/apache/commons/...      
using the classloader AntClassLoader[C:...\AntTask\antTask.jar]

我正在尝试几个小时,但我无法弄清楚我是如何编辑我的build.xml所以我只需要指向这个单独的.jar文件就可以了..

谢谢你们

1 个答案:

答案 0 :(得分:0)

所有taskdef都将任务名称与包含执行该任务的代码的类文件相关联。但是,为了找到该类文件,您需要告诉<taskdef/>在哪里找到包含它的jar。这就是所有类路径都是。

您不必使用<taskdef/>任务定义类路径。默认情况下,Ant会查找包含<taskdef/> $ANT_HOME/lib任务代码的所有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 jar,我会在jar中看到它包含net/sf/antcontrib/antcontrib.properties 1 文件。该文件看起来像这样:

...
# 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
...

它所做的只是使用该任务的类文件定义每个任务。我建议你做一些与你的自定义ant任务类似的事情。这样,如果您决定包含其他任务,则只需修改这个文件,开发人员就不必在其jar中更改<taskdef/>定义,也不必添加多个。{/ p>

顺便说一句,你应该做好并确保你的班级不会与其他人可能使用的其他班级发生冲突。您可能希望为您的类名提供包含唯一前缀的完整路径:

<taskdef name='antTask' classname="com.vegicorp.anttasks.RepairTask">

假设您为VegiCorp工作......


1 Ant contrib任务包含两个这样的文件。一种是XML格式,另一种是属性格式。我总是使用XML格式,这就是您在定义Ant任务资源时要使用的内容。我使用了属性文件,因为它是一种更简单的格式,更容易看到发生了什么。