Ant の外側から Apache Ant™ タスクを使用する

理由

Apache Ant は、buildfile の作成者や管理者に豊富なタスクを提供します。ただ、プログラマーはどうでしょうか?Ant のタスクによって提供される機能は、Java プログラムで使用できますか?

答えは「はい」で、しかもとても簡単です。ただし、詳細に入る前に、このアプローチの長所と短所を説明します。

長所

堅牢 Ant のタスクは非常に堅牢です。多くの人が何度も叩いても壊れません。さまざまなコンテキストで使用されており、そのため、数多くの境界条件と見過ごされがちなエラーに対処するように装備されています。
クロスプラットフォーム Ant のタスクはクロスプラットフォームです。すべてのボリュームプラットフォーム、およびいくつかの非常に珍しいもの(たとえば Netware や OS/390)でテストされています。
コミュニティサポート Ant のタスクを使用すると、サポートする独自のコードが少なくなります。Ant のコードは、Apache Ant コミュニティ全体でサポートされています。

短所

Ant ライブラリの依存性 明らかに、コードで Ant のタスクを使用する場合は、ant.jar をパスに追加する必要があります。もちろん、コードオプティマイザーを使用して不要なクラスを削除することはできますが、それでもおそらく Ant コアのチャンクが必要になります。
柔軟性の喪失 Ant のコードを変更する必要が生じた場合、その時点で「独自にコードを書く」方が理にかなっている可能性があります。もちろん、コードスニペットや優れたアイデアを盗むことはできます。これがオープンソースの利点です!

たとえば、Java から特定のディレクトリに ZIP ファイルをプログラムで解凍するとします。もちろん、この作業を行う独自のルーチンを書くこともできますが、すでに作成されている Ant のタスクを使用しても同じことです。

私の例では、XSLT 変換からファイルを解凍できるようにしたいと考えていました。XSLT 変換は、Java で静的メソッドをプラグインすることで拡張できます。したがって、次のような関数が 1 つ必要です。

/**
 * Unzip a zip file into a given directory.
 *
 * @param zipFilepath A pathname representing a local zip file
 * @param destinationDir where to unzip the archive to
 */
 static public void unzip(String zipFilepath, String destinationDir)

この関数を処理する Ant タスクは、org.apache.tools.ant.taskdefs.Expand です。必要なのは、ダミーの Ant の ProjectTarget を作成し、通常は buildfile で設定される Task パラメータを設定し、execute() を呼び出すだけです。

最初に、適切なインクルードがあることを確認しましょう

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 のタスクをプログラムで呼び出す方法を示すことです。

この時点で疑問に思っているのは、ダミーのプロジェクトとターゲットを設定するためにどのクラスとメソッドを呼び出せばよいかでしょう。答えは簡単です。わかりません。結局のところ、腰を据えてソースコードを読む覚悟が必要です。上記に示した例は、単にあなたの食欲をそそり、作業のきっかけを作るために設計されています。さあ、始めましょう!