Ant自帶了大量的任務(Task),在網上也有大量的任務可用,可是假如你面對的是別人根本不會想到的問題,怎么辦呢?其實,只要花一點點功夫就可以編寫出自己的任務出來。我開始也沒想到會這樣簡單(做嵌套任務碰到一點問題),由此可見Ant的結構設計是相當優秀的。
假設我們需要顯示任務執行各花了多少時間,寫一個TimerTask
起步:覆蓋org.apache.tools.ant.Task的execute方法
import org.apache.tools.ant.Task;
import org.apache.tools.ant.BuildException;
public class TimerTask extends Task {
public void execute() throws BuildException {
System.out. } } 注重,編譯時ant.jar必須在Classpath上。 簡單起見,假設java源文件,類文件在同一目錄下,在此目錄再寫一個build.xml文件: <?xml version="1.0" ?> <project name="testTimer" default="test" basedir="."> <taskdef name="timer" classname="TimerTask" classpath="."/> <target name="test"> <timer /> </target> </project> 打開Dos窗口,到此目錄,運行ant 夠簡單吧!假如類路徑比這復雜或者在jar文件中,設置<taskdef>的classpath屬性就行了。 繼續:設置屬性 假設我們想添加一個action屬性,在Java文件中: private String action; …. 進入討論組討論。 public void execute() throws BuildException { if (action.equals(“init”)) { … … } public String getAction() { return action; } public void setAction(String string) { action = string; } 在xml文件中: <timer action=”init” /> 使用Project保存中間結果 對于這個任務來講,必須把時間值保存起來,比較合適的就是org.apache.tools.ant.Project了,Project對象生命期是整個Build,并且可以通過setProperty, getProperty等方法保存/獲取值。 public void execute() throws BuildException { if (getOwningTarget() == null) 進入討論組討論。 return; Project proj = getOwningTarget().getProject(); … // can do smt with proj now } 晉級:嵌套任務 假如我們想要在Timer下面再嵌套子任務(似乎沒有這個必要 :-): <timer action=”init” > <foo /> </timer> 那我們首先只需要寫一個簡單的FooTask,然后在build.xml加上<foo>的定義: <taskdef name="timer" classname="TimerTask" classpath="."/> <taskdef name="foo" classname="FooTask" classpath="."/> 然后給TimerTask添加一個方法: public void addFoo(FooTask foo) { } 注重:addXXX的XXX由<taskdef>中的name決定,Ant會利用Java Reflection去找;類型必須是具體的類型FooTask,不能是Task。
}
發表評論
共有條評論
用戶名:
密碼:
驗證碼:
匿名發表
新聞熱點
疑難解答