編寫(xiě)自定義任務(wù),輕松擴(kuò)展Ant
Ant自帶了大量的任務(wù)(Task),在網(wǎng)上也有大量的任務(wù)可用,可是如果你面對(duì)的是別人根本不會(huì)想到的問(wèn)題,怎么辦呢?其實(shí),只要花一點(diǎn)點(diǎn)功夫就可以編寫(xiě)出自己的任務(wù)出來(lái)。我開(kāi)始也沒(méi)想到會(huì)這樣簡(jiǎn)單(做嵌套任務(wù)碰到一點(diǎn)問(wèn)題),由此可見(jiàn)Ant的結(jié)構(gòu)設(shè)計(jì)是相當(dāng)優(yōu)秀的。
假設(shè)我們需要顯示任務(wù)執(zhí)行各花了多少時(shí)間,寫(xiě)一個(gè)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.println("I am a timer");
}
}
注意,編譯時(shí)ant.jar必須在Classpath上。
簡(jiǎn)單起見(jiàn),假設(shè)java源文件,類(lèi)文件在同一目錄下,
<?xml version="1.0" ?>
<project name="testTimer" default="test" basedir=".">
<taskdef name="timer" classname="TimerTask" classpath="."/>
<target name="test">
<timer />
</target>
</project>
打開(kāi)Dos窗口, 到此目錄,運(yùn)行
夠簡(jiǎn)單吧!如果類(lèi)路徑比這復(fù)雜或者在jar文件中,設(shè)置<taskdef>的classpath屬性就行了。
繼續(xù):設(shè)置屬性
假設(shè)我們想添加一個(gè)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保存中間結(jié)果
對(duì)于這個(gè)任務(wù)來(lái)講,必須把時(shí)間值保存起來(lái),比較合適的就是org.apache.tools.ant.Project了,Project對(duì)象生命期是整個(gè)Build,
public void execute() throws BuildException {
if (getOwningTarget() == null)
return;
Project proj = getOwningTarget().getProject();
…
// can do smt with proj now
}
晉級(jí):嵌套任務(wù)
如果我們想要在Timer下面再嵌套子任務(wù)(好像沒(méi)有這個(gè)必要 :-):
<timer action=”init” >
<foo />
</timer>
那我們首先只需要寫(xiě)一個(gè)簡(jiǎn)單的FooTask, 然后在build.xml加上<foo>的定義:
<taskdef name="timer" classname="TimerTask" classpath="."/>
<taskdef name="foo" classname="FooTask" classpath="."/>
然后給TimerTask添加一個(gè)方法:
public void addFoo(FooTask foo) {
}
注意:addXXX的XXX由<taskdef>中的name決定,
聯(lián)系客服