#author("2021-12-14T01:54:39+00:00","","")
#author("2021-12-14T01:57:11+00:00","","")
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents

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

***クラスパスを通しておく [#a535aa97]
Eclipseなどで開発するときは、ant.jarをプロジェクトのクラスパスに通しておく必要があります。

***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
確かにネストしたタグの値を表示することができました。。

***ネストしたタグを複数定義したい [#bf1ae0f3]
たとえば
 <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[タグ名]();が呼ばれるので、生成したオブジェクトをフィールドに保持しておくってのをやってます。











***関連リンク [#z58fed9e]
-[[サンプルソースのダウンロード(CVS)>http://www.masatom.in/cgi-bin/viewvc.cgi/AntSamples/?root=cvs]]
-[[@IT:Java TIPS -- Antで使う新規タスクにネストした要素を渡す>http://www.atmarkit.co.jp/fjava/javatips/085jakarta008.html]] 配列を子要素に持ちたいときはこう書くらしい
-[[独自タスクの記述>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を使うときはこのようにしないとダメみたい。。いやあはまりました。
-[[ApplicationContext in Ant Task. - Spring Framework Support Forums続き>http://forum.springframework.org/showthread.php?t=14635&page=2]] 上のだけだと、Eclipse上でAntはOKでもコマンドラインからのAntでコケてしまった。結局続きのページに書いてあるようなコードを記述をする必要があるようです。あーよくわからんですがこれでOK!

----
この記事は
#vote(おもしろかった[9],そうでもない[0])
#vote(おもしろかった[10],そうでもない[0])

#comment
#topicpath


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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS