为什么Ant taskdef无法加载./net之外的资源

时间:2010-01-12 15:28:12

标签: ant taskdef

使用taskdef声明外部ant任务时,例如ant-contrib,建议的设置是使用followin taskdef:

<taskdef resource="net/sf/antcontrib/antcontrib.properties">
  <classpath>
    <pathelement location="lib/ant-contrib/ant-contrib-1.0b3.jar"/>
  </classpath>
</taskdef>

当antcontrib.properties相对于build.xml文件位于net / sf / antcontrib中时,这是有效的。

但是当我把它放在lib / net / sf / antcontrib中并将taskdef更改为

<taskdef resource="lib/net/sf/antcontrib/antcontrib.properties">
  <classpath>
    <pathelement location="lib/ant-contrib/ant-contrib-1.0b3.jar"/>
  </classpath>
</taskdef>

Ant无法找到属性文件,它会给出错误

[taskdef] Could not load definitions from resource
lib/net/sf/antcontrib/antcontrib.properties. It could not be found.

似乎ant分别处理lib目录并且无法从那里加载taskdef资源。

3 个答案:

答案 0 :(得分:5)

正如亚历克斯所说,你不应该解开罐子。 <taskdef>可以直接从jar中加载antcontrib.properties。

您得到的错误是因为您更改了资源路径,但压缩jar / zip中文件的路径仍然相同。 taskdef没有注意你移动的属性文件,因为你提供给<classpath>的{​​{1}}告诉它只能查看jar。

答案 1 :(得分:4)

使用antlib.xml资源:

这是我使用的taskdef定义:

<property name="ant-contrib.jar" location="..."/>

<taskdef
  resource="net/sf/antcontrib/antlib.xml"
  uri="http://ant-contrib.sourceforge.net"
>
  <classpath>
    <pathelement location="${ant-contrib.jar}"/>
  </classpath>
</taskdef>

您无需从jar文件中提取任何内容。此外,如果您不想将名称空间与antcontrib任务一起使用,uri属性是可选的。

答案 2 :(得分:2)

要处理任务定义的类路径,我在Ant中使用类路径引用,这样更容易。您可以链接包含类的目录,也可以链接包含许多.jar的目录,当然也可以链接一个.jar。

例如:

    <!-- Properties -->
    <property name="lib" value="lib/" />
    <property name="classes" value="bin/" />

    <!-- Classpath definition -->
    <path id="runtime-classpath" >
        <pathelement location="${bin}" />
        <fileset dir="${lib}">
            <include name="*.jar"/>
        </fileset>
    </path>

    <!-- Taskdefs definitions -->
    <taskdef name="myTask" classname="org.stackoverflow.tasks.MyTask" classpathref="runtime-classpath" />

    <!-- Tasks -->
    <target name="test" description="Test Action">
            <myTask parameter1="value" />
    </target>