import org.apache.tools.ant.Task; import org.apache.tools.ant.Project; import org.apache.tools.ant.BuildException; /** Apache Ant 支持自定义任务。下面是使用Java自定义Ant任务的demo * * task class: TimerTask * properties: action:[init, print] * sub task: <subTaskOne, FooTask> */ public class TimerTask extends Task { // +--+--+ 给自定义任务添加属性 +--+--+ /** * 在xml中用下列方式引用 * <timer action=”init” /> */ private String action; // String getter() public String getAction() { return action; } // void setter(String) public void setAction(String string) { action = string; } // +--+--+--+--+--+--+--+--+--+--+--+--+ // +--+--+ 再嵌套子任务 +--+--+ /** * 使用样例: * <taskdef name="timer" classname="TimerTask" classpath= "." /> * <taskdef name="subTaskOne" classname="FooTask" classpath="." /> * * <timer action=”init” > * <subTaskOne/> * </timer> * * FooTask是另外一个自定义的Task */ private FooTask foo = null; public void addSubTaskOne(FooTask foo) { this.foo = foo; } // +--+--+--+--+--+--+--+--+--+--+--+--+ // private static final String TIME_PROPERTY_INTERNAL = "timer.msecs" ; private static final String TIME_PROPERTY_NAME = "timer.passed" ; // public void execute() throws BuildException { System.out.println( "I am a timer" ); if (this.getOwningTarget() == null) return; // Project对象的生命期是整个Build,并且可以通过setProperty和getProperty等方法保存/获取值 Project proj = this.getOwningTarget().getProject(); String strTime = proj.getProperty(TIME_PROPERTY_INTERNAL); try { long currMSecs = System.currentTimeMillis(); if (action.equals( "print" )) { if (strTime == null) proj.setProperty(TIME_PROPERTY_NAME, "Timer not initilized" ); else { long startMSecs = Long.parseLong(strTime); long passedSecs = currMSecs - startMSecs; int minutes = ( int ) ( passedSecs * 1.0 / (1000 * 60 * 60) ); int hours = minutes / 60; minutes = minutes % 60; strTime = hours + " hours " + minutes + " minutes" ; proj.setProperty(TIME_PROPERTY_NAME, strTime); } } else if (action.equals( "init" )) { proj.setProperty(TIME_PROPERTY_INTERNAL, Long.toString(currMSecs)); } } catch (NumberFormatException nfe) { throw new BuildException(nfe.getMessage()); } // 执行嵌套的子任务 if (foo != null) { foo.execute(); } } }