// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents

***カスタムタスクって [#jec18b8a]
Antはすでにある組み込みタスクを使うだけでなく、自分でタスクを作成することもできます。カスタムのタスクを作る方法を調べたのでやり方をメモっておきます。

***org.apache.tools.ant.Taskを拡張する [#v1afcca0]
カスタムタスクは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でタスクを定義しています。属性の設定内容は以下の通り
-name:タスク名を定義します
-classname:タスククラスを指定します
-classpath:そのクラスが入っているjarをしていします(パスを通してます)

またこのビルドファイルには
 <sampletask message="hogehoge" />
というようにmessege属性がありますが、これはタスククラスのmessageフィールドのgetter/setterに対応しています。

***ビルドファイルを実行する [#lbff182b]
ビルドファイル(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が実行されました。。


***ネストしたタグを作る [#ccec0ba2]
上の例で、タスクに属性を定義したい場合はタスククラスに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
確かにネストしたタグの値を表示することができました。。


***関連リンク [#z58fed9e]
-[[サンプルソースのダウンロード(CVS)>http://www.masatom.in/cgi-bin/viewvc.cgi/AntSamples/?root=cvs]]
-[[独自タスクの記述>http://www.jajakarta.org/ant/ant-1.6.1/docs/ja/manual/develop.html#writingowntask]]
-[[ApplicationContext in Ant Task. - Spring Framework Support Forums>http://forum.springframework.org/showthread.php?t=14635]] AntTaskクラスからSpringを使うときはこのようにしないとダメみたい。。いやあはまりました。
----
この記事は
#vote(おもしろかった[3],そうでもない[0])

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS