Top / Java / Ant / カスタムタスクを作る

カスタムタスクって

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

クラスパスを通しておく

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

org.apache.tools.ant.Taskを拡張する

カスタムタスクは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に対応しています。

ビルドファイルを実行する

ビルドファイル(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[タグ名]();が呼ばれるので、生成したオブジェクトをフィールドに保持しておくってのをやってます。

関連リンク


この記事は

選択肢 投票
おもしろかった 8  
そうでもない 0  

Top / Java / Ant / カスタムタスクを作る

現在のアクセス:14982


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-02 (金) 18:03:32 (446d)