第1章
構成管理入門  

第2章
Subversionによるバージョン管理入門

第3章
Subversionベストプラクティス

第4章
Maven2によるビルド入門

第5章
Maven2ベストプラクティスリリースの自動化

第6章
リリースの自動化

Appendix
Maven 2はまり道


※WEB+DB PRESS Vol.39掲載の記事を載せています。

第4章 Maven2によるビルド入門

Authors:YAMAMOTO Ryuzo

さらに開発を進めよう

新しいプロジェクトの作成は終わりました。成果物(WARファイル)の作成もmvn packageコマンド一撃ということもわかりました。 では、いよいよ開発を進めていくわけですが、もちろん先ほど作成されたom.xmlだけでは不十分です。 ここでは、新規プロジェクト作成後の次の開発ステップを説明していきます。
開発を進めていくには、pom.xmlへの追加設定など、次のような準備が必要です。

ソースディレクトリの作成

先ほど作成されたプロジェクトのひな形には、 開発を進めるにあたって必要なソースディレクトリがありません。
プロジェクトひな形の種類に応じて、次のディレクトリを手動で作成してください。

依存ライブラリの追加

依存ライブラリを追加するには、基本的にはpom.xmlへdependency要素を追加するだけです。 たとえば、JakartaプロジェクトのCommons Langを追加したい場合、リスト4のように追記するだけです。 追記後に、mvn packageコマンドを再度実行してみましょう。 commons-lang-2.3.pomおよびcommons-lang-2.3.jarがダウンロードされましたね。 targetディレクトリのWARファイルの中身を展開して見てみると、 WEB-INF/lib/commons-lang-2.3.jar が追加されていることがわかります。

●リスト4 ライブラリcommons-langを追加(pom.xml)
<project>
...
<dependencies>
...
<dependency>
<groupId>commons-lang</groupId>
<artifactId>env</artifactId>
<version>2.3</version>
</dependency>
</dependencies>
...
</project>


■groupId/artifactId/versionって言われても…
依存ライブラリを追加するには、「CommonsLangはどの groupId、artifactIdで定義されていて、 どのバージョンがあるのか?」ということを知っていないとdependency定義を書けませんね。
「Maven Repository」というWebサイト注4を利用すると、 セントラルリポジトリなどのリモートリポジトリに登録されている成果物を検索できます。 検索結果はpom.xmlにそのままコピー & ペーストできてしまう便利なサイトですので、 ぜひ使ってみてください。

■公開されていないんですが
使いたいライブラリがMaven2のリポジトリで公開されていない場合があります。 たとえばSun Microsystemsが提供しているライブラリはライセンスのためセントラルリポジトリなどの リモートリポジトリには登録されていないものがあります。 また、商用ライセンスのライブラリもやはりリモートリポジトリにはありません。
これらのライブラリをMaven 2から利用するには、dependency定義の追加だけではだめで、ローカルリ ポジトリへの登録を行う必要があります。ローカルリポジトリへの登録は、次のコマンドを利用します。
> mvn install:install-file
-Dfile=登録するライブラリファイルのパス
-DgroupId=groupId
-DartifactId=artifactId
-Dversion=バージョン
-Dpackaging=packaging (実際は1行)

ここで指定するgroupIdやartifactIdは、Sun Microsystemsが提供しているライブラリについては、 Maven 2では表4のように推奨されています。

表4 Sun MicrosystemsのライブラリのgroupId、artifactIdの推奨値
ライブラリ groupid artifactid
Servlet API javax.servlet servlet-api
JSP ASP javax.servlet jsp-api
JavaMail javax.mail mail
JavaBeans Activation Framework javax.activation activation


表4は一部ですので、ほかのものについては公式サイト(注5)にて確認してください。
なお、この方法では、登録したライブラリ自体が依存している別のライブラリの解決は行えませんので注意してください。
では、実際にJavaBeans Activation Frameworkをローカルリポジトリに登録してみましょう。 まずはライセンスに同意してダウンロードサイト(注6)から配布アーカイブjaf-1_1-fr.zipをダウンロードします。 適当な場所に展開し、次のコマンドを実行してローカルリポジトリに登録します。
> mvn install:install-file -Dfile="C:\java\jaf-1.1\
activation.jar" -DgroupId=javax.activation -Dartifa
ctId=activation -Dversion=1.1 -Dpackaging=jar
(実際は1行)

■依存ライブラリのスコープ
これまで「依存ライブラリ」と一括りに説明してきましたが、依存ライブラリには 「いつ利用されるか・どこにあるか」で違いがあります。 たとえば、 JUnitはテストを実行するときには必要ですが、アプリケーションが実際に動作するとき には必要ないライブラリです。 また、ServletAPIはWebアプリケーション内には同封せず、アプリケーションコンテナが提供する ライブラリです。
このように「いつ利用されるか・どこにあるか」というライブラリの存在範囲を Maven 2では「scope」と呼び、表5のように定義しています。

表5 Maven 2のscope
scope いつ利用されるか・どこにあるか
compile いつも利用される(デフォルト) ServleAPI、JSP ASP
provided JDKやコンテナによって提供される ServleAPI、JSP ASP
runtime 実行時のみに必要 JDBCドライバ
test テスト時のみに必要 JUnit
system リポジトリは検索しないで明示的にライブラリの場所を指定 tool.jar


dependencyの追加は、このscopeを意識して行うようにしましょう。依存ライブラリを追加したつもりでも 、間違ったscope設定を行うと、コンパイルできない、テストが実行できないなどの問題が起きますので 注意しましょう。 先ほどのServlet APIの例では、Webアプリケーション(WARファイル)には含めませんので、 scopeとして「provided」を指定します(注7)。
注4)http://mvnrepository.com/
注5)http://maven.apache.org/guides/mini/guide-coping-with-sun-jars.html
注6)http://java.sun.com/products/javabeans/jaf/downloads/
注7)これを指定しないと、サーブレットコンテナのServlet APIと WARファイルに含まれるServlet APIが競合してしまい、Webアプリケーション実行時に NoClassDefFoundErrorになります。

Eclipseで開発する

Maven 2プロジェクトをEclipseで開発するには次の2つの方法があります(注8)。 どちらを利用してもかまいませんが、m2eclipseプラグインは若干不安定な部分や 「mvnコマンドではうまくいくのにm2eclipseからはうまくいかない」などの場合もあり、 お勧めしたいのはMaven Eclipse Pluginです。
ここでは、Maven Eclipse Pluginを使う場合の手順を説明していきます。
  1. クラスパス変数M2_REPOの追加
  2. 初めてMaven Eclipse Pluginを使う場合、Eclipseに「M2_REPO」というMaven 2リポジトリのパス を表すクラスパス変数を追加します。 Maven 2プロジェクトのトップディレクトリ(pom.xmlと同じ場所。 今回の例ではwebdb-webappディレクトリ)にて、次のコマンドを実行します。
    > mvn -Declipse.workspace="C:\eclipse\workspace"
    eclipse:add-maven-repo (実際は1行)
    

  3. Eclipse設定ファイル(.classpathなど)の作成
  4. 次に、同じくMaven 2プロジェクトのトップディレクトリにて、Eclipseの設定ファイル (.classpathなど)を作成するコマンドを実行します。
    > mvn -DdownloadSources=true eclipse:eclipse
    

    -DdownloadSources=trueオプションは、使用するライブラリのソースアーカイブがリポジトリに存在すればダウンロードして、自動的にEclipseでソースアタッチメントを行ってくれるものです。

  5. Eclipseへのインポート
  6. 最後にEclipseでプロジェクトをインポートします。
◆ ◆ ◆
以上がEclipseで開発を始めるときに必要な設定です。開発後にライブラリを追加したい場合は、 dependency要素に追加しただけではEclipseのクラスパスは更新されませんので、再度2.を実行する必 要があります。ただし、Eclipseからの設定で適用された.classpathや.projectの変更が上書きされてしま いますので、注意してください(注9)。
なお、本稿では使い方を紹介しませんでしたが、m2eclipseは依存ライブラリをpom.xmlに追加するだけ でダウンロード・クラスパスの設定を自動的に行ってくれる機能があり、すばらしいプラグインです ので、実際に試して両者の違いを知り、どちらか使うか、または併用するかなどを検討してみてください。
注8)どちらも「プラグイン」のため紛らわしいですが、「Maven Eclipse Plugin」はMaven 2のプラグイン、「Maven Integration for Eclipse」はEclipseのプラグインです。
注9)コマンドの再実行前に.classpath、.projectをいったん待避させて、Eclipseからの設定部分を手動でマージする必要があります。

ビルド方法のカスタマイズ〜 プロファイル〜

開発環境と本番環境とでデータベースの設定が異なることがあります。 「開発中は自分のPCにインスールしたデータベースに接続し、本番環境ではWebアプリケーションとは 別マシンのデータベースに接続する」というようにです。 また、アプリケーションを配備するOSごとに異なる設定や依存ライブラリが必要となる場合もあります。
Maven 2には、このようなターゲットとなる環境ごとで設定や依存ライブラリ、 ビルド手順などを変更できるようにするためのしくみ「プロファイル」があります。 プロファイルは、pom.xmlやsettings.xmlに記述します。
たとえば、リリース用のプロファイルをリスト5のように設定します。

●リスト5 profileの設定例その1(pom.xml)
<project>
...
<profiles>
<profile>
<id>release</id>
[リリース用のための設定をここに書く]
</profile>
</profiles>
</project>


リリース用のパッケージを作成する際には、「mvn -P release package」のようにプロファイルの 「id」を指定してコマンドを実行することで、その設定内容が有効になります。
なお、プロファイルの有効化は-Pオプション以外にも、「Windowsだったら有効化」や「特定のシステムプロパティが設定されていたら有効化」のように、柔軟に設定することもできます(リスト6)

●リスト6 profileの設定例その2(pom.xml)
<project>
...
<profiles>
<profile>
<id>test</id>
<activation>
<property>
<name>env</name>
<value>test</value>
</property>
</activation>
[システムプロパティ「env」が「test」の場合の設定をここに書く]
</profile>
</profiles>
</project>