木曜日 8 24, 2006
木曜日 8 24, 2006
Java EE 5は従来のJ2EE 1.4に較べて飛躍的にエンタープライズ・アプリケーションの開発を簡単にしました。しかし、Java EE 5仕様のAPIレベルでは開発効率を高めてくれてはいるものの、AppServerにデプロイするためのWARファイルやEARファイルの構成はJ2EE 1.4と同様であるため、そのビルド手順は相変わらず複雑です。
NetBeans 5.5はJava EE 5に対応しており、複雑にネストしたEARファイル構成であってもあまり苦労せずにデプロイ可能なアプリケーションをパッケージングすることができます。しかしながら、実際の開発プロジェクトでは、目的の成果物をビルドする以外にも、ドキュメント作成や品質管理、情報共有に関わる様々なタスクが存在します。これらのタスクは日々繰返し行なわなければならないため、ほとんどの開発プロジェクトではこれらのタスクを自動化する努力をしています。
現在のNetBeansやEclipseなどのIDEは、設計とビルド、および単体テスト辺りまでが守備範囲で、開発プロジェクトに関わるその他のタスクのサポートとオートメーションについては十分とは言えません。Apache Mavenは、開発プロジェクトのライフサイクルを自動化することを目的としたプロジェクト管理ツールの1つです。
Mavenはビルド・ツールのApache Antと比較されることが多いと思います。Antを使っても開発プロジェクトのオートメーション化は可能ですが、Mavenを使用すると自前のスクリプトをほとんど書かずに開発プロセスをオートメーション化することができます。
以下では、簡単なJava EE 5アプリケーションをMavenを用いて作成する手順をご紹介します。ここで使用するのはMaven 2.0ですので、まだMaven 1.0しか使ったことのない方にも参考になると思います。
Maven 2そのもののインストールは簡単です。Mavenのダウンロード・ページから、最新のバージョン2.0.4のアーカイブをダウンロードし、適当なディレクトリに展開し、そのディレクトリmaven-2.0.4/binを環境変数のPATHに設定してあげるだけです。以下は、シェルにbashを使用している場合の~/.bashrcの設定例です。
# Mavan export PATH=~/java/maven-2.0.4/bin:$PATH
以下のようにmvnコマンドが実行できれば基本的なインストールは完了です。
$ mvn --version
Maven version: 2.0.4
$ mvn --help
usage: mvn [options] [<goal(s)>] [<phase(s)>]
:
Mavenは必要に応じて、インターネット上のレポジトリ・サーバからプラグインやサード・パーティのライブラリをダウンロードします。もし、あなたのマシンがファイヤウォールの中にあるなら、~/.m2/settings.xmlというファイルを作成し、以下のようにHTTPプロキシーの設定をしてください。
<settings>
<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
<host>proxy.mycompany.com</host>
<port>8080</port>
<username>your-username</username> <!-- if necessary -->
<password>your-password</password> <!-- if necessary -->
</proxy>
</proxies>
</settings>
Maven2のコマンドmvnでは、時々とても長いコマンドラインを入力しなければなりません。もし、あなたがシェルにbashを使用しているなら、以前のエントリ"Bash completion for Maven 2"に従って、bash completionの設定を行なって下さい。
もし、あなたがIDEとしてNetBeansを使用しているなら、Mavenide2-NetBeansプラグイン・モジュールをインストールするとよいでしょう。これにより、NetBeansからMaven2のプロジェクトをそのまま開くことができるようになり、簡単な操作ならNetBeans上でも行なうことができるようになります。インストール手順は、こちらにある通りに行なえばOKです。
Maven2プラグインのJava EE 5への対応状況を調べてみると、現状では十分な状況とは言えません。そのため、ここで使用するサンプル・アプリケーションの作成に必要なプロジェクト・テンプレート(Maven2用語でarchetypeと呼びます)を作成しました。以下のリンクにあるarchetypeモジュールをダウンロードし、ローカル・リポジトリにインストールします。
$ mvn install:install-file -Dfile=ee5-archetype-war-jsf-1.1.jar \
-DgroupId=sample.plugin \
-DartifactId=ee5-archetype-war-jsf \
-Dversion=1.1 \
-Dpackaging=maven-plugin
上記により、archetypeモジュールがプラグイン・メタデータと共に、ローカル・リポジトリ(~/.m2/repository/)に保存されます。
【追記 2007/01/18】 Java EE 5 APIライブラリがhttps://maven-repository.dev.java.net/に登録されたため、以下の手順(ローカルリポジトリへのjavaee.jarのインストール)は不要になりました。
Java EE 5を構成する一部のAPIライブラリは、Maven2のセントラル・リポジトリにありますが、EJB3やJTA 1.1など重要なものが欠落しています。そのため、SJS AppServer 9 (glassfish)に含まれるjavaee.jarをローカル・リポジトリにインストールします。
$ cd $ASROOT/lib
$ mvn install:install-file -Dfile=javaee.jar \
-DgroupId=javax.ee \
-DartifactId=javaee \
-Dversion=5.0 \
-Dpackaging=jar
上記コマンドにより、以下のモジュールがローカル・リポジトリに保存されたことになります。
| groupId | artifactId | type(packaging) | version |
|---|---|---|---|
| sample.plugin | ee5-archetype-war-jsf | maven-plugin | 1.1 |
| javax.ee | javaee | jar | 5.0 |
先程インストールしたee5-archetype-war-jsfを雛型にして、Webモジュール用プロジェクトを作成します。プロジェクトの作成には、mvnコマンドにゴール名archetype:createを指定し、必要なパラメータを加えて実行します。ここでは、プロジェクト名をmywebappとしてプロジェクトを作成します。
$ mvn archetype:create -DarchetypeArtifactId=ee5-archetype-war-jsf \
-DarchetypeGroupId=sample.plugin \
-DarchetypeVersion=1.1 \
-DartifactId=mywebapp \
-DgroupId=com.example
上記の場合、コマンドラインのパラメータは全て指定しなければなりません。archetypeArtifactId/archetypeGroupId/archetypeVersionは先ほどインストールしたひな形モジュールのartifactId/groupId/versionです。artifactId/groupIdは作成しようとしているプロジェクトの成果物(WARモジュール)を一意に識別するための名前です。groupIdは、ソースツリーのベース・パッケージ名にも使用されます。artifactIdは成果物につける名前ですが、作成するプロジェクトの最上位のディレクトリ名としても使用されます。
上記のコマンド実行により、以下のようなソースコード・ツリーが作成されます。
mywebapp/
|-- pom.xml
`-- src/
`-- main/
|-- java/
| `-- com/
| `-- example/
| `-- Page.java
|-- resources/
`-- webapp/
|-- META-INF/
| `-- context.xml
|-- WEB-INF/
| |-- faces-config.xml
| `-- web.xml
|-- index.html
`-- page.jsp
Maven2プロジェクトには必ずpom.xmlが含まれます。これはPOM(Project Object Model)と呼ばれ、プロジェクトのメタ情報をXML形式で表現したものです。mvnコマンドはこのPOMを読みとって、プロジェクト毎にカスタマイズされたタスクを実行するわけです。
このサンプル・プロジェクトはJSFページ1つ、バッキング・ビーン1つのだけの簡単なWebアプリケーションですが、すぐにWARを作成して動作を確認できるようになっています。
WARモジュールを作成するには、mvnコマンドにフェーズ名packageを指定して実行します。これにより、targetディレクトリにデプロイ可能なmywebapp.warが作成されます。
$ cd mywebapp/
$ mvn package
[INFO] Scanning for projects...
:
$ ls target
classes/ mywebapp/ mywebapp.war
mvnコマンドに指定したフェーズ名packageはそのプロジェクトの最終成果物(artifact)を生成するためのおまじないです。実際のところ、プロジェクトがejbモジュール用であろうと、スタンドアロン・アプリケーション用であろうと、あるいはプラグイン開発用のものであろうと、一貫して成果物を得るためのコマンドは mvn package でよいのです。
それでは動作を確認してみましょう。SJS AppServer 9 (glassfish)のasadminコマンドを用いてmywebapp.warをデプロイし、http://localhost:8080/mywebapp/にアクセスして、サンプルのページが表示されることを確認してみてください。
$ $ASROOT/bin/asadmin deploy target/mywebapp.war
ここで使用したサンプルのarchetypeは、Java EE 5のServlet 2.5/JSF 1.2仕様に基づいたものです。そのため、Servlet 2.4仕様までしかサポートしていないTomcatにはデプロイできないことに注意してください。
今回の例は、WARモジュール1つだけのシンプルな場合でしたが、Maven2の実力はマルチプロジェクトを連携したより複雑な場合に真価を発揮します。次回は、EJBモジュールを含めたマルチプロジェクトの場合を例に取り上げて紹介します。