2

我已经阅读了这篇文章并用它来编写我的第一个 Ant 任务,名为AutoTestTask

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 目录中 -有人可以确认吗?令我困惑的是xmlns:at="antlib:org.me.auto-test"XML 顶部的属性,特别是该antlib:<whatever>部分。这是某种特定于 Ant 的协议,它说“*任何由at命名空间限定的东西都可以在 ${ANT_HOME}/lib 中找到,并且根包为org.me.auto-test*”?如果没有,有人可以解释它的含义吗?

另外,如果我遗漏了任何明显的内容或配置不正确,请告诉我。提前致谢!

4

4 回答 4

1
  1. 我不能用连字符编译一个包,所以我建议你auto-test改成autotest
  2. taskdef你有at-autotest,应该是autotest
  3. xmlns声明用于 xml 解析器和使用 antlibs。您不需要将它们用于您的第一个 ant 任务。所以:删除xmlnsat:前缀。

既然您问“我错过了什么”,请报告您收到的错误消息是什么。可能在遵循上述建议之后。

于 2012-09-30T18:33:49.403 回答
0

您正在尝试将您的任务打包为antlib。XML 文件将匹配命名空间并包含 taskdef 操作。

antlibs 相对较新,这可以解释为什么一些较旧的“如何创建 ANT 任务”教程没有提及它们。

于 2012-09-30T14:53:25.943 回答
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。但是你不必这样做,如果你知道位置可以直接引用jar(例如,你的项目根文件夹中的一个lib文件夹)。您可以使用 指定包含 jar 的类路径<taskdef>,如下所示(假设您已经定义了该类路径并分配了 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 声明。在此处阅读。这是“antlib:”命名空间前缀的位置带来了一些好处。我个人不喜欢将东西放在 ${ANT_HOME}/lib 中,所以我很乐意<taskdef />将无论如何,命名空间前缀作为约定。

于 2012-10-01T01:17:10.470 回答
0

大多数情况下,通过扩展创建一个新的 ant 任务org.apache.tools.ant.Task是矫枉过正的。
请注意,还有其他方法:
使用scriptdef与可以完全访问 ant api ieGroovy 的脚本语言、Javascript
(jdk >= 6 附带基于 rhino 1.6 的内置 javascript 引擎)在 ant 中定义任务。
之后要捆绑你的东西,创建一些包含所有scriptdefmacrodef的 commons.xml,并使用 import 使其可用于其他 ant 脚本。

于 2012-09-30T20:17:18.910 回答