使用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资源。
答案 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>