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はJakarta-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のコードを変更すれば、もっと"思い通りに"使えることに気づくでしょう。 もちろん、あなたはコードの断片やよいアイデアを盗むことはできます。 これはオープンソースの美点です!

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 Apache Software Foundation. All rights Reserved.

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