我已阅读this文章并用它来编写我的第一个名为AutoTestTask
的Ant任务:
public class AutoTestTask extends org.apache.tools.ant.Task {
// ...
}
我还将此对象编译并打包到auto-test.jar
。
如果我对Ant的理解是正确的,那么将其作为另一个项目构建的一部分包含在内,我使用以下XML:
<project name="SomeProject" basedir="." default="deploy" xmlns:at="antlib:org.me.auto-test">
<!-- Task definitions. -->
<taskdef name="at-autotest" classname="org.me.auto-test.AutoTestTask"/>
<!-- Use the task. -->
<at:autotest/>
</project>
我相信我还需要将auto-test.jar
复制到我的$ {ANT_HOME} / lib目录中 - 有人可以确认吗?令我困惑的是{ {1}}属性位于XML的顶部,特别是xmlns:at="antlib:org.me.auto-test"
部分。这是某种特定于Ant的协议,它说“* antlib:<whatever>
命名空间限定的任何内容都可以在$ {ANT_HOME} / lib中找到,其根包为at
*”?如果没有,有人可以解释它的含义吗?
此外,如果我遗漏了任何明显的或有任何错误配置,请告诉我。提前谢谢!
答案 0 :(得分:1)
auto-test
更改为autotest
taskdef
at-autotest
autotest
应为xmlns
xmlns
声明适用于xml解析器和使用antlibs。您不需要将它们用于第一个ant任务。所以:删除at:
和{{1}}前缀。由于您询问“我缺少什么”,请报告您收到的错误消息。可能在遵循上述建议之后。
答案 1 :(得分:0)
您尝试将任务打包为antlib。 XML文件将匹配命名空间并包含taskdef操作。
antlibs相对较新,这可以解释为什么一些较旧的“如何创建ANT任务”教程没有提及它们。
答案 2 :(得分:0)
通过扩展org.apache.tools.ant.Task
主要创建一个新的ant任务是过度的
请注意还有其他方法:
使用scriptdef结合脚本语言,可以完全访问ant api ieGroovy,Javascript
(jdk&gt; = 6附带基于rhino 1.6的内置javascript引擎)来定义里面的任务蚂蚁。
要在之后捆绑您的内容,请创建一些包含所有scriptdef和macrodef的commons.xml,并使用import使其可用于其他ant脚本。
答案 3 :(得分:0)
好的,它比你想象的要简单,但你必须要小心。
第一个问题是<taskdef name="at-autotest" .. />
,因为那时你尝试将任务用作“at:autotest”。 “at”是xml名称空间前缀,因此您需要在任务台定义的开头删除“at-”。
第二个问题是您没有将taskdef与xml名称空间“antlib:org.me.auto-test”相关联,因此您无法使用该前缀。在此阶段,您可以将其与<autotest/>
中的当前命名空间(即无前缀)一起使用。但我建议您为所有外部任务指定一个单独的命名空间,因此正确的版本是:
<project name="SomeProject" basedir="." default="deploy" xmlns:at="antlib:org.me.auto-test">
<!-- Task definitions. -->
<taskdef name="autotest" classname="org.me.auto-test.AutoTestTask" uri="antlib:org.me.auto-test"/>
<!-- Use the task. You can use the prefix "at:" here -->
<at:autotest/>
</project>
还有一些事情:
此设置强制您将任务类的jar放入$ {ANT_HOME} / lib。但是您不必这样做,如果您知道位置(例如,项目根文件夹中的lib文件夹),则可以直接引用jar。您可以指定包含带<taskdef>
的jar的类路径,如(假设您已定义该类路径并分配了id =“autotest.classpath”):
<!-- Task definitions. -->
<taskdef name="autotest" classname="org.me.auto-test.AutoTestTask"
uri="antlib:org.me.auto-test" classpathref="autotest.classpath" />
正如另一个人在这里建议的那样,你可以将你的课程打包成一个完整的antlib。与jar的唯一区别在于它包含一个文件'antlib.xml',如果这个jar已经在主类路径中,你甚至可以跳过taskdef声明。阅读here。这就是“antlib :“名称空间前缀带来一些奖励。我个人不喜欢把东西放在$ {ANT_HOME} / lib中,所以我很乐意将<taskdef />
与classpath一起使用,但我仍然建议将你的jar包装成一个antlib,并使用antlib作为命名空间前缀作为约定。