ant的功能有目共睹,不强也不弱,对于一般的构建任务足够胜任,但有一些需要使用ANT原生(或者ant-contrib)功能无法完成的,这时就可以调用外部程序执行功能
众所周知ant是基于task的构建工具,且是基于java的,于是可以拿ant的jar包来开发自定义的Task类。最基本的示例如下:1
2
3
4public class LowCaseTask extends Task {
public void execute() {
}
}
继承org.apache.tools.ant.Task并实现execute即可。然后打包jar包备用。
在build.xml中,通过1
<taskdef name="lowcaseTask" classname="cn.itrunner.LowCaseTask" classpath="lowcasetask.jar"/>
name字段为自定义的任务名字,随便
classname为需要执行的入口类,需要继承Task
classpath是jar包的路径,可以使用1
2
3
4<path id="xxx">
<path path="p1.jar"/>
<path path="p2.jar"/>
</path>
如此便定义了一个自定义任务。
调用时使用自定义任务作为标签即可,如上面的Task,可以使用1
<lowcaseTask/>
如此便能触发LowCaseTask中的execute方法。
交互一个很重要的特性是参数的传递与结果值的返回,使用上述的办法同样可以做到这一点。在LowCaseTask类中,可以定义各种set方法,用于接收参数,命名采用小驼峰,如需要接收一个变量名为”fileName”的参数,可以增加一个方法为1
2
3 public void setFileName(String fileName) {
log("filename");
}
其中log可以在执行ant任务时输出消息。当需要从ant中传递一个参数到java时,可以使用1
<lowcaseTask fileName="lowcasetask.jar"/>
这样,java中的对应方法就会被调用。
当java端处理完消息后,需要将结果返回给ant,那么需要通过新建一个参数来返回结果,在java内可以使用:1
getProject().setNewProperty("fileName","new FileName");
propertyName为ant处调用时使用的参数名,propertyValue为需要设进去的值。这样ant端就能接收到新的变量值来做其他事了,如1
2<lowcaseTask property="fileName"/>
<echo message="${fileName}"/>
这样就能从java里构建的fileName参数传递回ant中,就能完成交互了。