2012-09-30 40 views
2

我已阅读this文章,并用它来写我的第一个Ant任务称为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目录 - 有人可以确认吗?令我困惑的是XML顶部的xmlns:at="antlib:org.me.auto-test"属性,特别是antlib:<whatever>部分。这是否是某种特定于Ant的协议,它说:“* at名称空间限定的任何内容都将在根目录为org.me.auto-test *”的$ {ANT_HOME}/lib中找到?如果没有人能解释它是什么意思?

此外,如果我错过了任何明显的或有任何配置不正确,请让我知道。提前致谢!

回答

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. 这个设置迫使你把你的罐子为任务类放入$ {ANT_HOME}/lib中。但是,您不必这样做,如果知道位置(例如,项目根文件夹中的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声明读取here这是“antlib:”命名空间前缀我个人不喜欢把东西放在$ {ANT_HOME}/lib中,所以我很乐意在类路径中使用<taskdef />,但我仍然建议将你的jar打包为antlib,并使用antlib:作为一个名称空间前缀,无论如何都是作为一个惯例。

0

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

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

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

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

0

大部分通过扩展org.apache.tools.ant.Task来创建一个新的ant任务是矫枉过正的。
通知还有其他的方法太:
使用scriptdef用(JavaScript引擎基于犀牛1.6 JDK> = 6个附带有自己的内置),其已经完全进入蚂蚁API ieGroovy,使用Javascript
脚本语言结合,确定蚂蚁内的任务。
以后要捆绑你的东西,创建一些commons.xml,其中包含所有的scriptdefmacrodef,并使用导入使其可用于其他ant脚本。

相关问题