Projectを活用している?」で、Tomcatに次いで利用者が多かったビルドツールのAntを取り上げます。Antについては、基本編と応用編の2回に分けてご紹介します。基本編となる今回は、Antの概要と基本的な使い方について解説しましょう。ビルドツールというと、makeを思い浮かべる方も多いと思いますが、AntのビルドファイルはXMLで記述するという特徴があり、Javaとの親和性も高くなっています。前述の読者調査によると、現在利用中の開発ツールとして「エディタ+JDK」が最も多かったのですが、まさにこの開発パターンでこそAntを使うのが王道ということができるでしょう。JBuilderなどのIDEを使っている方は、「IDEを使ってビルドすればAntなんて必要ないのではないか?」と思われるかもしれません。Windows環境で開発を行い、動作確認をUNIX上で行うといったクロス開発を行っている場合、ソースコードの不具合を見つけるたびにWindows上でビルドして、UNIX環境にコピーして動作確認する......といった手間がかかる作業を繰り返していることはありませんか?動作確認を行うためのマシンがネットワークに接続されている場合はまだよいのですが、そうでない場合はフロッピーディスクやCD-Rに書き込むなど、手間が倍増します。このようなときにも、Antを利用することにより、JDKがインストールされた環境であれば、簡単にソースからビルドすることができ、ファイルコピーの手間が省け開発効率が上がります。最近のIDEはAntをサポートしているものも多いので、Antで作成しておけば、ほかのIDE上で簡単にビルドすることもできます。Antを使ってみよう「百聞は一見にしかず」ということで、まずはAntを使ってみましょう。AntをJakartaのサイトhttp://www.apache.org/dist/ant/binaries/からダウンロードして、適当なディレクトリに解凍してください。筆者の環境では、執筆時の最新バージョン1.5.1を/usr/local/jakarta-ant-1.5.1(Windowsの場合は、c:\usr\local\jakarta-ant-1.5.1)に展開しました。サンプルをダウンロードして実際に試してみましょう。ここからダウンロードしてください。Antの環境設定を行います。UNIX環境の場合、環境変数JAVA_HOMEにJDKのインストールディレクトリを、ANT_HOMEにAntのインストールディレクトリを設定し、PATHを$ANT_HOME/binに通せば準備は完了です。準備ができたら、下記のようにサンプルを展開し、antコマンドを実行してください。jar:/tmp/hello-ant/foo-1.0.jar最初の環境変数の設定は、.bashrcなどに書いておくとよいでしょう。Windowsの環境の場合は、ユーザー環境変数のJAVA_HOME、ANT_HOME、PATHをそれぞれ、下記のように設定します。JAVA_HOMEc:\j2sdk1.4.1_01(J2SDKのインストールディレクトリ)ANT_HOMEc:\usr\local\jakarta-ant-1.5.1PATHc:\usr\local\jakarta-ant-1.5.1\bin環境設定ができたら、以下のようにantコマンドを実行してください。次のような実行結果が得られるはずです。secondsこれで、Javaソースのコンパイルとjarファイルfoo-1.0.jarの作成が行われました。Antは実行したカレントディレクトリにあるビルドファイルbuild.xmlを読み込み、ビルドを実行します。この例では、後で紹介するビルドの実行単位「ターゲット」のデフォルト値がjarとなっているので、jarターゲットの実行と、jarターゲットに依存したcompileターゲットを実行しています。classesディレクトリの下のFoo1.classを実行しみてみましょう。以下の実行結果が得られるはずです。Foo1こんにちはAntデフォルトでは実行されませんが、サンプルにはjavadocの生成プロセスも含めているため、次のようにjavadocターゲットを指定して実行すると、apiディレクトリの下にJavaDocが生成されます。[ビルドファイル名]で、ビルドファイルを指定することもできます。Antの特徴Antの具体的な解説に入るまえに、Antの特徴について整理しましょう。Antを使うと以下のようなメリットがあります。(1)複雑なコンパイルプロセスを簡略化可能Antを利用すると、コンパイル、jarファイル作成などのビルド手順を形式化できるので、複雑なビルド手順を簡略化できます。逆に、簡単なビルドコマンドでコンパイルできる場合(例えば、ソースファイルが1つしかなく、javacコマンドを1回実行するだけでコンパイル可能な場合など)は、ビルドファイルの作成に手間がかかり、かえって作業負荷が増えます。(2)豊富なJava開発ツールへの対応javac、jar、rmic、war、native2asciiなどのコマンドの実行に対応しています。Antでは、それぞれのコマンドを実行するための「タスク」と呼ばれるクラスが用意されています。最近では、JavaBeansからEJBを生成するxdoclet/vdocletなど、Jakarta以外からもタスクが提供されています。(3)処理プロセスのグループ化ソースのコンパイルやjarファイルの生成、javadoc生成など、あるまとまった処理をターゲットにまとめることができます。javacタスクとnative2asciiタスクをまとめてコンパイルターゲットとすることができます。ターゲットにより、その時々で必要とされる処理のみを簡単に選択して実行できるようになっています。jarファイルの作成の前には、ソースのコンパイルが必要です。Antはこのような処理の依存関係を解決できます。そのためjarファイルを作成する前に、ソースがコンパイルされているか否かを意識する必要がなくなります。(5)インクリメンタルなビルドビルド処理を行うタスクは、基本的にタイムスタンプを調べて処理が必要なファイルだけ処理します。一度ソースをコンパイルした後でソースを変更した場合、変更があったソースのみを再コンパイルすることができます。Antの使い方をmakeと比較して理解するでは、makeで用いるMakefileとAntのビルドファイルを対比しながら、Antの使い方を見ていきましょう。makeで使用するMakefile(リスト1)を見てください(なお、リスト1とリスト2は機能毎に色分けしています)。$(JAVADOC_DEST)このMakefileをAntのビルドファイル(build.xml)に書き換えると次のようになります(先ほど実行したBuild.xmlを少し簡略化しています)。/></target></project>最も大きな違いとして、Makefileはコマンドの羅列で記述されているのですが、AntのビルドファイルはXMLで記述されています。具体的に機能ごとに違いを見てみましょう。■デフォルトの処理の指定ここでのデフォルトの処理とは、オプションの指定を省略したとき、AntとMakeが何の処理を行うか、ということを指します。ビルドコマンドを実行したときのデフォルトの処理は、Makeの場合、一番初めに記述された処理になりますが、Antではprojectタグで指定します。上記の例では、jarファイル作成をデフォルトの処理にしています。default="jar"...>の部分が該当します。■変数の設定AntもMakeもビルドファイルの中で自由に参照可能な変数を宣言することができます。makeは、Makefileの先頭のブロックで以下のように変数設定を行います。変数名=値そして、以下のように変数の参照を行います。$(変数名)これに対して、Antは、以下のようにpropertyタグを使って、変数(Antでは変数のことを通常プロパティと呼びます)の設定を行います。value="値"/>そして、以下のように変数の参照を行います。${変数名}■コマンドの実行makeでは、例えば下記の記述を見れば分かるように、mkdir、javacなどのシェルコマンドを直接呼び出して処理を進めます。$(BUILD_SRC)これに対してAntでは、前述したようにjavac、jar、javadocなど、実際に実行するコマンドに対応づけられたタスクを実行することで処理を進めていきます。タスクは、次のように表記します。...><引数(要素)>値</引数(要素)></タスク名>引数は、各タスク固有の値を取りますが、例えば、mkdir、delete、copyなどのファイル操作を行うタスクは、dir(ディレクトリを指定する)などの共通引数を指定できます。引数は、属性と要素の2種類が指定できますが、基本的には属性に引数を設定します。ファイルの集合、クラスパスなどは引数で指定することもできます。タスクの具体的な使い方については、詳しく後述します。■依存関係の記述ビルドを行うときに、jarファイルの作成の前には、ソースのコンパイルが必要などの依存関係が発生しますが、makeもAntも依存関係を記述することができます。複数のコマンドを実行したい場合、改行して記述という形式で、依存関係を記述します。makeは“:”より左側のファイルのタイムスタンプと右側のファイルのタイムスタンプを調べて、左より右のタイムスタンプが新しい場合、もしくは、左側のファイルが存在しない場合、コマンドを実行します。($(BUILD_SRC))に対して、mkdir/javacが実行されます。($(JAR))が生成されます。各ステップは、処理の必要がなければスキップされます。jarコマンドでjarファイルを生成するための何も実行しないダミー行です。これに対して、Antは、ターゲットに対して依存関係を記述して定義します。実行済みの場合ターゲット1を実行せずに、ターゲット2を実行という動作をします。ここで注意が必要なのは、makeは、生成されたファイルとソースのタイムスタンプを調べて依存関係を処理しますが、ターゲットは「現在実行されているAntですでに処理されたかどうか」を調べ、ファイルのタイムスタンプを調べていません。Antを実行するごとに各ターゲットは実行されます。実際にファイルのタイムスタンプを調べてコマンドを実行するかどうかは、タスクが判別します。Antの利点さて、ここまでの話を読むと、一見して、「できることはMakefileと同じだが、XMLで記述しなければならない分、antの方が面倒なのでは?」と思われる方もいるかもしれません。ここまでの内容を整理すると、Antを使うと次のようなメリットがあります。(1)ファイルの依存関係を記述する必要がなくなるタスクが与えられた各ソースと生成されるファイルのタイムスタンプを調べて、処理が必要なソースだけを処理してくれます。Makefileのように1つ1つファイルを指定して依存関係を記述する必要はありません。foo2.javaというように個別にファイルを指定する必要がありました。これに対してAntでは、srcdir="..."というようにディレクトリを指定すれば、そのディレクトリ以下のすべてのファイルを処理対象にしてくれます。Makefileでもfindを利用すれば、あるディレクトリ以下の*.javaにマッチするファイルなどをグループ化することができますが、それに比べても手間がかかりません。上記のメリットは、Javaのアプリケーションのビルド時に受けられる恩恵で、C言語の開発などでは、taskからコマンド呼び出しを行うだけになってしまい、Antの恩恵は受けられないので注意してください。次に、Antの要であるタスクの中で、特に重要と思われるjavac、jar、javadoc、war、echoについて紹介します。引数については、よく使われるものを抜粋して掲載しています。詳細が知りたい場合はJakartaプロジェクトのタスク一覧を参照してください。日本語による情報が欲しい場合は、Ja-Jakartaによる日本語訳をご覧ください。●javacタスクjavacはその名のとおり、javacコマンドをタスクにしたもので、表1に示す引数を持ちます。NO(false)※true/falseを指定するクラスパスにjarファイルをいくつか含めたい場合は、pathタスクと組み合わせて利用すると便利です。libディレクトリの下のjarファイルにすべてクラスパスを通し、サーブレットクラスのためにTomcatもしくはWebLogicのjarファイルにクラスパスを通してコンパイルを行うには、次のように記述します。libディレクトリ以下のincludeで指定したファイルをmyclasspathに含める。/>pathの設定は、javacを実行するターゲット内に含めることもできますが、初期設定という意味で、プロパティを定義した後に入れるとよいでしょう。●jarタスクjarタスクは、jarファイルを作成するタスクで、表2の引数を持ちます。NO例えば、マニフェストファイルにmanifestを指定してbuild/classes以下のファイルをjarに圧縮したい場合、次のように記述します。destfile="foo.jar"basedir="build/classes"manifest="manifest"/>●warタスクwarタスクは、WebアプリケーションのWARアーカイブを作成します。warファイル自体、もともとjar形式のファイルであることもあり、jarファイルと同じですが、war用にいくつか引数が追加されています。ここでは、jarに追加された引数を表3に紹介します(実は、warタスクを実行するクラス自身がjarタスクのクラスを継承しています)。WEB-INF/libディレクトリに含めるjarファイル。WEB-INF/classesディレクトリに含めるクラスファイルを指定。NO※:updateオプション(既存のファイルを上書きする)をtrueに設定していれば、設定する必要はありませんWebアプリケーションの配備記述子にmyweb.xml、サーブレットなどのクラスファイルをclassesディレクトリ以下のファイルに指定し、libディレクトリ以下のjarファイルを含めるサンプルは次のようになります。/></war>classesとlibは、ネストしたタグに含める必要がある点に注意してください。●javadocタスクjavadocを生成するタスクで、表4の引数を取ります。WEB-INF/libディレクトリに含めるjarファイル。WEB-INF/classesディレクトリに含めるクラスファイルを指定。NO(false)(true/falseを指定)javadocは、次のように実行します。Building</center>"Author="true"destdir="api"/>●echoタスクビルド中にメッセージを表示することができます。echoは、次のように使います。/>ビルドファイルをデバッグする際にプロパティの値や実行経過を表示したり、ビルド方法の表示などに利用すると便利です。日本語利用時の注意点Antを日本語環境で利用する際にいくつか注意すべき点があるので、少し述べておきます。encoding="Windows-31J"?>のようにencoding属性で指定する必要があります。この例では、Windows-31J(MS932)を指定していますが、UNIXなどをお使いの場合は、euc-jpなどに変えてください。文字コードが指定されていない場合、ビルドファイル読み込み時にエラーが発生します。ちなみにデフォルトエンコーディングはUTF-8ですので、UTF-8でビルドファイルを記述すれば、encoding属性を指定する必要はありません。●javac、javadocタスクのエンコーディングを指定することソースコードに日本語が含まれる場合は、javacタスクの中で次のように必ずソースコードのエンコーディングを指定するようにしてください。encoding="Windows-31J"...この記述を行わなくても、システムデフォルトのエンコーディングでソースコードを記述していれば問題なくコンパイルできますが、Windows上で作成したコードをLinux上でコンパイルするなど、デフォルトのキャラクタセットが異なる環境でAntを実行すると、正しくコンパイルできなくなります。encodingは常に指定するようにしておきましょう。javadocタスクの場合は、次のようにソースのエンコーディング、出力HTMLのエンコーディング、ロケールを指定するようにします(ロケールを指定しないと英語環境でjavadocを利用すると、javadocが生成するHTMLが英語になるので注意してください)。<javadocencoding="Windows-31J"docencoding="iso-2022-jp"locale="ja"...この例では、ソースがWindows-31J、javadocで出力するHTMLファイルはiso-2022-jpとなります。そのほかのタスクでも、適宜エンコーディングを指定する癖をつけておいた方がよいでしょう。ファイルセットとパターンAntを利用する際に覚えておくと便利な機能にファイルセットとパターンがあります。ファイルセットはその名のとおり「ファイルの集まり」を記述したものです。filesetは、javaのソース、classファイルなど、どのようなファイルでも扱うことができますが、特にクラスパスを設定するときjarファイルの集合を定義するのに便利です。次のようにlibディレクトリの下にコンパイル時に必要なjarファイルがあるとします。libディレクトリ以下のincludeで指定したファイルをclspathに含める。/></javac>とすれば、lib以下の赤色のjarファイル(commons-logging.jar、oro.jar、servlet.jar)に対して、簡単にクラスパスに通すことができます。Antでは、パターンと呼ばれる正規表現を簡単にしたものをfilesetタグの中で利用することができ、*は、0個以上の文字を表すパターンなので、*.jarによりカレントディレクトリ(ここではlib)中の拡張子がjarであるファイルすべてを指定できることになります。name="**/*.jar"></fileset>と、**を用いると、カレントディレクトリ以下の拡張子がjarであるファイルを再帰的に探し出し、すべてのjarを指定することができます。上記の例では、j2ee.jarを含んだ赤色、青色すべてのjarファイルを含めることができます。次回は、応用編ということで、Antを使って、1つのJavaコードから簡単にEJBを作成する方法をご紹介します。(株)NTTデータに入社。文字認識ソフトウェアの研究開発を経て、Webサービス関連の研究開発に携わる。GNU/Linuxの優れたメンテナンス性とほかのディストリビューションを圧倒するパッケージ数に引かれDebianを使い始めたのをきっかけに、Debianプロジェクトの開発者となる。Lundqvistらとともに、Javaサポートの強化を行う。VM対応などを行っている。Developer』(ソフトバンクパブリッシング)などで執筆活動を行っている。ProjectについてJa-Jakartaプロジェクトでは、Jakartaプロジェクトのドキュメントの和訳やプロダクトの国際化/日本語化などを行っている。現在、プロジェクトのメンバーを募集中。Ja-Jakartaプロジェクトの活動に参加しようという方は、「Ja-Jakartaプロジェクトへの参加方法」(http://www.ingrid.org/jajakarta/site/getinvolved.html)を参照。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。