Using Ant Tasks Outside of Ant

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

Rationale

論理的根拠

Ant provides a rich set of tasks for buildfile creators and administrators. But what about programmers? Can the functionality provided by Ant tasks be used in java programs?

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

Yes, and its quite easy. Before getting into the details, however, we should mention the pros and cons of this approach:

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

Pros

利点

Robust Ant tasks are very robust. They have been banged on by many people. Ant tasks have been used in many different contexts, and have therefore been instrumented to take care of a great many boundary conditions and potentially obscure errors.
Cross Platform Ant tasks are cross platform. They have been tested on all of the volume platforms, and several rather unusual ones (Netware and OS/390, to name a few).
Community Support Using Ant tasks means you have less of your own code to support. Ant code is supported by the entire jakarta-ant community.
堅牢 Antのタスクはとても堅牢です。多くの人々によって叩かれてきました。 Antのタスクは多くの異なった状況下で使われてきました。 それゆえ、多くの境界条件や潜在的で分かりにくいエラーに注意を払うよう試されてきました。
クロスプラットホーム Antのタスクはクロスプラットホームです。 珍しいプラットホーム(例えばNetwareやOS/390など)を含めて、 さまざまななプラットホームのほとんどでテストされてきました。
コミュニティーのサポート Antのタスクを使うことで、サポートすべきあなた自身のコードを少なくできます。 AntのコードはApache Antコミュニティー全体でサポートされています。

Cons

欠点

Dependency on Ant Libraries Obviously, if you use an Ant task in your code, you will have to add "ant.jar" to your path. Of course, you could use a code optimizer to remove the unnecessary classes, but you will still probably require a chunk of the Ant core.
Loss of Flexibility At some point, if you find yourself having to modify the Ant code, it probably makes more sense to "roll your own." Of course, you can still steal some code snippets and good ideas. This is the beauty of open source!
Antのライブラリへの依存 明らかに、Antのタスクを自分のコードの中で使う場合、 "ant.jar"をクラスパスへ追加することになります。 もちろん、コードの最適化を行って不要なクラスを除くのは可能です。 しかしまだ、Antの主要部分は必要なままでしょう。
柔軟性がないこと 場合によっては、 Antのコードを変更するはめになった場合、たぶん「自分のコードを使う」方が理に適うこともあるでしょう。 もちろん、(その場合でもAntから)コードの断片やよいアイデアを盗むことはできます。 これがオープンソースの美点です!

Example

Let's say you want to unzip a zip file programmatically from java into a certain directory. Of course you could write your own routine to do this, but why not use the Ant task that has already been written?

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

In my example, I wanted to be able to unzip a file from within an XSLT Transformation. XSLT Transformers can be extended by plugging in static methods in java. I therefore need a function something like this:

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

/**
 * Unzip a zip file into a given directory.
 * 
 * zipファイルを所定のディレクトリに解凍する。
 *
 * @param zipFilepath A pathname representing a local zip file
 * @param destinationDir where to unzip the archive to
 *
 * @param zipFilepath ローカルのzipファイルを表すパス名
 * @param destinationDir アーカイブを解凍するディレクトリ
 */
 static public void unzip(String zipFilepath, String destinationDir)

The Ant task to perform this function is org.apache.tools.ant.taskdefs.Expand. All we have to do is create a dummy Ant Project and Target, set the Task parameters that would normally be set in a buildfile, and call execute().

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

First, let's make sure we have the proper includes:

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

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

The function call is actually quite simple:

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

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();

In actual practice, you will probably want to add your own error handling code and you may not want to use a local inner class. However, the point of the example is to show how an Ant task can be called programmatically in relatively few lines of code.

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

The question you are probably asking yourself at this point is: How would I know which classes and methods have to be called in order to set up a dummy Project and Target? The answer is: you don't. Ultimately, you have to be willing to get your feet wet and read the source code. The above example is merely designed to whet your appetite and get you started. Go for it!

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


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

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