编写我的第一个Ant任务:我错过了什么?

时间:2012-09-30 13:38:31

标签: xml ant taskdef

我已阅读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 *”?如果没有,有人可以解释它的含义吗?

此外,如果我遗漏了任何明显的或有任何错误配置,请告诉我。提前谢谢!

4 个答案:

答案 0 :(得分:1)

  1. 我无法使用连字符编译包,因此建议您将auto-test更改为autotest
  2. taskdef at-autotest autotest应为xmlns
  3. xmlns声明适用于xml解析器和使用antlibs。您不需要将它们用于第一个ant任务。所以:删除at:和{{1}}前缀。
  4. 由于您询问“我缺少什么”,请报告您收到的错误消息。可能在遵循上述建议之后。

答案 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引擎)来定义里面的任务蚂蚁。
要在之后捆绑您的内容,请创建一些包含所有scriptdefmacrodef的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>

还有一些事情:

  1. 此设置强制您将任务类的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" />
    
  2. 正如另一个人在这里建议的那样,你可以将你的课程打包成一个完整的antlib。与jar的唯一区别在于它包含一个文件'antlib.xml',如果这个jar已经在主类路径中,你甚至可以跳过taskdef声明。阅读here。这就是“antlib :“名称空间前缀带来一些奖励。我个人不喜欢把东西放在$ {ANT_HOME} / lib中,所以我很乐意将<taskdef />与classpath一起使用,但我仍然建议将你的jar包装成一个antlib,并使用antlib作为命名空间前缀作为约定。