第4章 Maven2によるビルド入門
Authors:YAMAMOTO Ryuzo
新しいプロジェクトの作成は終わりました。成果物(WARファイル)の作成もmvn packageコマンド一撃ということもわかりました。
では、いよいよ開発を進めていくわけですが、もちろん先ほど作成されたom.xmlだけでは不十分です。
ここでは、新規プロジェクト作成後の次の開発ステップを説明していきます。
開発を進めていくには、pom.xmlへの追加設定など、次のような準備が必要です。
- ソースディレクトリの作成
- 依存ライブラリの追加
- IDE(Eclipseなど)用の設定
- ビルド方法のカスタマイズ
先ほど作成されたプロジェクトのひな形には、
開発を進めるにあたって必要なソースディレクトリがありません。
プロジェクトひな形の種類に応じて、次のディレクトリを手動で作成してください。
- Webアプリケーションの場合(maven-archetype-webappを使用した場合)
- src/main/java
- src/test/java
- src/test/resources
- ライブラリの場合(maven-archetype-quickstartを使用した場合)
- src/main/resources
- src/test/resources
依存ライブラリを追加するには、基本的には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になります。
Maven 2プロジェクトをEclipseで開発するには次の2つの方法があります(注8)。
- Maven 2のプラグイン「Maven Eclipse Plugin」を使って、Eclipseの設定ファイル(.classpathな
ど)を作成する
- Eclipseプラグイン「Maven Integration for Eclipse」(m2eclipse)を使う
どちらを利用してもかまいませんが、m2eclipseプラグインは若干不安定な部分や
「mvnコマンドではうまくいくのにm2eclipseからはうまくいかない」などの場合もあり、
お勧めしたいのはMaven Eclipse Pluginです。
ここでは、Maven Eclipse Pluginを使う場合の手順を説明していきます。
- クラスパス変数M2_REPOの追加
初めて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行)
- Eclipse設定ファイル(.classpathなど)の作成
次に、同じくMaven 2プロジェクトのトップディレクトリにて、Eclipseの設定ファイル
(.classpathなど)を作成するコマンドを実行します。
> mvn -DdownloadSources=true eclipse:eclipse
-DdownloadSources=trueオプションは、使用するライブラリのソースアーカイブがリポジトリに存在すればダウンロードして、自動的にEclipseでソースアタッチメントを行ってくれるものです。
- Eclipseへのインポート
最後に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>