ネストしたタスクのサポート
自作のタスクで、ネストしたタスク(要素)を受け付けるようにするには、
- ネストしたタスクに対応するオブジェクトを作成し、
- タスクに、↑のオブジェクトを設定(または作成)するAPIを追加
します。
ネストしたタスクに対応するオブジェクト
↑のオブジェクトを設定(作成)するAPI
- 以下のいずれかをタスクに追加します。
メソッド名 | 例 | 動作 | |||
---|---|---|---|---|---|
void add<タスク名>(<オブジェクト>) | void addFoo( Foo foo ){...} | Ant側で作成されたオブジェクトが設定されます。(そのため、オブジェクトにはデフォルトコンストラクタが必要です。)呼び出されたタイミンクでは、属性は未設定です。 | |||
void addConfigured<タスク名>(<オブジェクト>) | void addConfiguredFoo( Foo foo ){...} | Ant側で作成されたオブジェクトが設定されます。(そのため、オブジェクトにはデフォルトコンストラクタが必要です。)呼び出されたタイミンクで属性が設定されています。 | |||
<オブジェクト> create<タスク名>() | Foo createFoo( ){...} | 返されたオブジェクトに対して、属性が設定されます。API内で返すオブジェクトを覚えておく必要があります。 |
サンプル
package ant; import java.util.ArrayList; import java.util.List; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; /** * ネストされたタスクをサポートするタスク */ public class NestedTask extends Task { /** * ネストされたタスクの値が格納されるリスト */ private List<WithName> list = new ArrayList<WithName>(); /** * タスクを実行する。 * @see Task#execute() */ public void execute() throws BuildException { for ( WithName wn : list) { System.out.println( wn.name ); } } /** * ネストしたKitten要素の値を設定する * @param kitten Kitten要素の値 */ public final void addKitten ( WithName kitten ) { this.list.add( kitten ); } /** * ネストしたPenguin要素の値を設定する * @return Penguin要素の値 */ public final WithName createPenguin ( ) { WithName wn = new WithName(); this.list.add( wn ); return wn; } /** * ネストしたPanda要素の値を設定する * @param panda Panda要素の値 */ public final void addConfiguredPanda ( WithName panda ) { this.list.add( panda ); } /** * ネストした要素に対応するオブジェクト。 */ public static class WithName { private String name; /** * デフォルトコンストラクタ / ※必須 */ public WithName () {} /** * 名前を設定する。 * @param name 名前 */ public final void setName ( String name ) { this.name = name; } } }
<?xml version="1.0" encoding="euc-jp"?> <project name="call-animals" default="call-animals" basedir="."> <!-- コンパイル済みタスクの配置パスを指定する --> <path id="lib.path"> <pathelement location="../../class" /> </path> <!-- タスクを定義する --> <taskdef name="call-animals" classname="ant.NestedTask" classpathref="lib.path"/> <target name="call-animals"> <!-- 実行 --> <call-animals> <!-- 子要素をいろいろ指定 --> <kitten name="mii"/> <penguin name="penny"/> <panda name="shanshan"/> <kitten name="tora"/> <kitten name="shiro"/> </call-animals> </target> </project>
実行結果です。
[xxx@xxxx]$ ant Buildfile: build.xml hello: [call-animals] mii [call-animals] penny [call-animals] shanshan [call-animals] tora [call-animals] shiro BUILD SUCCESSFUL Total time: 2 seconds
参考: Antでの開発-独自タスクの記述