2014-02-27 95 views
0

我正在为java编写一个ant的自定义任务,我的想法是,我可以给某人.jar,其中包含java文件,如类和库,以及ant的build.xml。他可以使用它。自定义蚂蚁任务与额外的库

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

Ant构建.XML是这样的:

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

我真的不明白这一切的classpath中的东西,所以有人可以告诉我,我要在我的构建文件添加,因此将与此.jar文件只工作不java代码的来源?

现在我得到一个错误,蚂蚁不能找到我在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文件和它的作品..

谢谢你们

+0

你可以从Ant发布整个错误消息吗?我怀疑你正在引用第三方JAR(如Apache StringUtils),在你使用自定义Ant任务的后续项目中,你可能没有参考它。 –

+0

taskdef无法找到类def.RepairTask所需的类:org/apache/commons/io/input/BOMInputStream使用类加载器AntClassLoader [C:... \ antTask.jar]。是的,它是第三方库。但它包含在生成的antTask.jar中,当我使用eclipse运行ant build.xml时(我编辑运行配置并添加缺少的apache jar),一切都正常工作,但我真的想现在怎么写这下到build.xml中,所以它将在没有日食的情况下工作 – yaay

回答

0

所有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任务资源时应该使用的内容。我使用了属性文件,因为它是一个更简单的格式,更容易看到发生了什么。