自定义Ant Task

在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

你可能感兴趣的:(自定义Ant Task)