Antの外からのAntタスクの利用

論理的根拠

Antはビルドファイルの作成者と管理者に対して、豊富なタスクを提供しています。 しかしプログラマに対してはどうでしょうか? Antが提供しているタスクを、機能上、javaプログラマが使うことはできるでしょうか?

答えは「はい」で、しかもとても簡単です。しかしながら、 詳細に入る前にこのアプローチの利点と欠点にふれておきます。

利点

堅牢 Antのタスクはとても堅牢です。多くの人々によって叩かれてきました。 Antのタスクは多くの異なった状況下で使われてきました。 それゆえ、多くの境界条件や潜在的で分かりにくいエラーに注意を払うよう試されてきました。
クロスプラットホーム Antのタスクはクロスプラットホームです。 珍しいプラットホーム(例えばNetwareやOS/390など)を含めて、 さまざまななプラットホームのほとんどでテストされてきました。
コミュニティーのサポート Antのタスクを使うことで、サポートすべきあなた自身のコードを少なくできます。 AntのコードはApache Antコミュニティー全体でサポートされています。

欠点

Antのライブラリへの依存 明らかに、Antのタスクを自分のコードの中で使う場合、 "ant.jar"をクラスパスへ追加することになります。 もちろん、コードの最適化を行って不要なクラスを除くのは可能です。 しかしまだ、Antの主要部分は必要なままでしょう。
柔軟性がないこと 場合によっては、 Antのコードを変更するはめになった場合、たぶん「自分のコードを使う」方が理に適うこともあるでしょう。 もちろん、(その場合でもAntから)コードの断片やよいアイデアを盗むことはできます。 これがオープンソースの美点です!

javaでプログラム的にzipファイルを任意のディレクトリに解凍したいとします。 もちろんそのために自分自身のルーチンを書くことは可能でしょうが、 すでに書かれたAntのタスクを利用しない手はないでしょう?

私の例では、XSLT変換を通してから、ファイルの解凍を可能にしたいと思いました。 XSLT変換はjavaのstaticメソッドを組みこむことで拡張が可能です。 したがって、以下のような機能が必要になります。

/**
 * zipファイルを所定のディレクトリに解凍する。
 *
 * @param zipFilepath ローカルのzipファイルを表すパス名
 * @param destinationDir アーカイブを解凍するディレクトリ
 */
 static public void unzip(String zipFilepath, String destinationDir)

この機能を行うAntのタスクはorg.apache.tools.ant.taskdefs.Expandです。 私たちがするべきことは、ダミーのAntのProjectTargetを作成し、 通常ビルドファイルでセットされるTaskパラメータをセットし、 execute()を呼ぶだけです。

まず、必ず適切なincludesを行ってください。

import org.apache.tools.ant.Project;
import org.apache.tools.ant.Target;
import org.apache.tools.ant.taskdefs.Expand;
import java.io.File;

この機能呼び出しは実際かなり単純です。

static public void unzip(String zipFilepath, String destinationDir) {

    final class Expander extends Expand {
        public Expander() {
 	        project = new Project();
	        project.init();
	        taskType = "unzip";
	        taskName = "unzip";
	        target = new Target();
        }	
    }
    Expander expander = new Expander();
    expander.setSrc(new File(zipfile));
    expander.setDest(new File(destdir));
    expander.execute();

実際は、エラー処理を行う自分のコードを追加したいと 思うかもしれませんし、ローカルなインナークラスを使いたくないかもしれません。 しかしながら、この例のポイントは、比較的少ないコード行数で、 Antのタスクがプログラム的に呼べることをを示すことです。

おそらくあなたが聞きたい質問はこれでしょう: ダミーのプロジェクトとターゲットを準備するために 呼ばなければいけないクラスやメソッドを どうやって知ったらよいか? 答えはこうです: できません。 結局、あなたは足をぬかるみに入れて、ソースコードを読もうとしなければなりません。 上の例は単に、あなたの興味を刺激し、あなたが手を出すように仕組んだものです。 やってみてください!


Copyright © 2002-2004 The Apache Software Foundation. All rights Reserved.

[訳注:これは宮本信二が翻訳し、高橋達男が校正しました。日本語訳に対するコメントがあれば report@jajakarta.orgに送ってください]