自定义Ant Task

来源:互联网 发布:天音网络黄涛 编辑:程序博客网 时间:2024/04/28 17:27

在ant打包的时候老是忘记把manifest.xml中的android:debugable改为false,后来干脆自定义个task来修改这项

官方的Turtorialhttp://ant.apache.org/manual/tutorial-writing-tasks.html

ant一般要干的事情,

1,编译我的东西

2,打一个可以发布的jar

3,清除现场

下面是个加上了个<property>s的简单的demo

<?xml version="1.0" encoding="ISO-8859-1"?><project name="MyTask" basedir="." default="jar">    <property name="src.dir" value="src"/>    <property name="classes.dir" value="classes"/>    <target name="clean" description="Delete all generated files">        <delete dir="${classes.dir}" failonerror="false"/>        <delete file="${ant.project.name}.jar"/>    </target>    <target name="compile" description="Compiles the Task">        <mkdir dir="${classes.dir}"/>        <javac srcdir="${src.dir}" destdir="${classes.dir}"/>    </target>    <target name="jar" description="JARs the Task" depends="compile">        <jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/>    </target></project>


首先自定义task要继承于ant.jar中的org.apache.tools.ant.Task,实现自己的execute内容

简单的demo如下,

import org.apache.tools.ant.Task;public class HelloWorld extends Task {    public void execute() {        // use of the reference to Project-instance        String message = getProject().getProperty("ant.project.name");        // Task's log method        log("Here is project '" + message + "'.");        // where this task is used?        log("I am used in: " +  getLocation() );    }}

获取自定义task的父工程可以通过方法getProject(),例如,projectName = getProject().getProperty("project.name"); 但是,不要在自定义task的构造方法中调用,此时会返回为null,在execute方法中才可以拿到数据

还有两个重要方法,可以从project中获取数据

  • String getProperty(String propertyName)
  • String replaceProperties(String value)

下面说下不带参数的build.xml文件中的调用

<?xml version="1.0" encoding="ISO-8859-1"?><project name="MyTask" basedir="." default="use">    ...    <target name="use" description="Use the Task" depends="jar">        <taskdef name="helloworld" classname="HelloWorld" classpath="${ant.project.name}.jar"/>//定义声明过程        <helloworld/>//调用过程    </target></project>

下面说下在build.xml的task中添加参数,调用的时候

   <helloworld message="Hello World"/>
,task中通过setMessage来读取,

import org.apache.tools.ant.Task;import org.apache.tools.ant.BuildException;public class HelloWorld extends Task {    String message;    public void setMessage(String msg) {        message = msg;    }    public void execute() {        if (message==null) {            throw new BuildException("No message set.");        }        log(message);    }}


对于build.xml的嵌套的属性

<helloworld>            <message msg="Nested Element 1"/>            <message msg="Nested Element 2"/> </helloworld>
对于的读取方式

先定义Message的内部类表示Message节点,该类有个msg属性,同样有一个setter函数,使其在build.xml中赋值,再根据Ant的框架,定义给Helloword注入message的 createXXX函数和持有Message列表的message对象,ant就会为你完成自动注入。

import java.util.Vector;

import java.util.Iterator;...    public void execute() {        if (message!=null) log(message);        for (Iterator it=messages.iterator(); it.hasNext(); ) {      // 4            Message msg = (Message)it.next();            log(msg.getMsg());        }    }    Vector messages = new Vector();                                  // 2    public Message createMessage() {                                 // 3        Message msg = new Message();        messages.add(msg);        return msg;    }    public class Message {                                           // 1        public Message() {}        String msg;        public void setMsg(String msg) { this.msg = msg; }        public String getMsg() { return msg; }    }...

参考,http://www.wangchao.net.cn/bbsdetail_69833.html

原创粉丝点击