Antはすでにある組み込みタスクを使うだけでなく、自分でタスクを作成することもできます。カスタムのタスクを作る方法を調べたのでやり方をメモっておきます。
Eclipseなどで開発するときは、ant.jarをプロジェクトのクラスパスに通しておく必要があります。
カスタムタスクはorg.apache.tools.ant.Taskクラスを拡張して作成します。そして実行したい処理を
public void execute() throws BuildException;
にoverrideするだけみたいですね。さてサンプルとして、以下のようなタスククラスを作成しました。
package nu.mine.kino.ant; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; public class SampleTask extends Task { private String message; public void execute() throws BuildException { System.out.println("エコーしてます: " + message); } public String getMessage() {return message;} public void setMessage(String message) {this.message = message;} }
このタスククラスに対応するビルドファイルは以下のようになります。
<taskdef name="sampletask" classname="nu.mine.kino.ant.SampleTask" classpath="./sample.jar" /> <target name="sample"> <sampletask message="hogehoge" /> </target>
taskdefでタスクを定義しています。属性の設定内容は以下の通り
またこのビルドファイルには
<sampletask message="hogehoge" />
というようにmessege属性がありますが、これはタスククラスのmessageフィールドのgetter/setterに対応しています。
ビルドファイル(build.xml)全体は以下の通りです。
<?xml version="1.0" encoding="Shift_JIS"?> <project name="taskdef_sample" default="sample"> <taskdef name="sampletask" classname="nu.mine.kino.ant.SampleTask" classpath="./sample.jar" /> <target name="sample"> <sampletask message="ハローワールド" /> </target> </project>
さて実行してみます。
Buildfile: T:\workspace3.2_plugin\AntSamples\build.xml sample: [sampletask] エコーしてます: ハローワールド BUILD SUCCESSFUL Total time: 172 milliseconds
確かにexecuteが実行されました。。
上の例で、タスクに属性を定義したい場合はタスククラスにSetterを作ればよいとわかりました。次にネストした要素を定義する場合です。たとえば
<?xml version="1.0" encoding="Shift_JIS"?> <project name="taskdef_sample" default="sample"> <taskdef name="sampletask" classname="nu.mine.kino.ant.SampleTask" classpath="./sample.jar" /> <target name="sample"> <sampletask> <echo message="hoge" /> </sampletask> </target> </project>
などのようにしたい場合ですね。
ネストはタスククラスに
public Object create[タグ名]();
を実装すればよいようです。たとえばこんな感じ。
package nu.mine.kino.ant; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; public class SampleTask extends Task { private Echo echo; public void execute() throws BuildException { System.out.println("エコーしてます: " + echo.getMessage()); } public Echo createEcho() { <-createXXXメソッド if (echo == null) { echo = new Echo(); } return echo; } }
Echoクラスは以下の通り、通常のJavaBeans?です。
package nu.mine.kino.ant; public class Echo { private String message; public String getMessage() {return message;} public void setMessage(String message) {this.message = message;} }
では実行してみます。
Buildfile: T:\workspace3.2_plugin\AntSamples\build.xml sample: [sampletask] エコーしてます: hoge BUILD SUCCESSFUL Total time: 454 milliseconds
確かにネストしたタグの値を表示することができました。。
たとえば
<fkenabler method="disable"> <table name="hoge" fkname="fuga"/> <table name="foo" fkname="bar"/> </fkenabler>
みたいな場合ですね。まあ予想がつくと思いますが、Listを使用します。具体的にはこんな感じです
private List<Table> tables = new ArrayList<Table>(); public Table createTable() { Table table = new Table(); tables.add(table); return table; }
ネストタグが一つだろうが複数だろうが、メソッドはcreate[タグ名]();となります。ようするに、antがbuild.xmlを解析していったときに「タグが見つかったらcreate[タグ名]を呼び出す」ってのをタグの個数分繰り返す仕組みのようです。。
で、何回もcreate[タグ名]();が呼ばれるので、生成したオブジェクトをフィールドに保持しておくってのをやってます。
この記事は
現在のアクセス:16897