第3回 基本ゴールを実行してみる
■ 今回の内容
前回はMavenをインストールして、genappゴールを使用してプロジェクトを作成しました。今回は作成したプロジェクトに対して実行できる最も基本的なゴールであるビルド、テスト実行について解説します。なお、本文中の表記について簡単にまとめておきます。
表記 | 意味 |
---|---|
foo.bar | プロパティ foo.bar |
${src.dir} | プロパティの src.dir の値参照 |
$HOME | 環境変数HOMEの値参照 |
Mavenで管理できるプロジェクトの形態は、単純なJavaライブラリから、アプリケーション、Webアプリケーション、J2EEアプリケーション、などなど多岐に及びます。今回はその中で最も基本的なゴールであるソースのビルド、テストの実行、プロジェクトレポートの生成について見ていきます。ゴールはAntのターゲットと同様の扱いになります。つまり「maven ゴール名」で実行します。
■ java:compile
まず最初のゴールはソースのコンパイルです。project.xmlに設定してあるソースディレクトリ配下のソースをコンパイルし、クラスファイルを指定のディレクトリに出力します。ソースディレクトリはproject.xmlの <sourceDirectory> 要素に設定されているディレクトリとなります。クラスファイルの出力先は、標準では target/classes になっています。もし出力先を変更したい場合は、project.properties内で maven.build.dist を設定する必要があります。 [1]
外部Jarとの依存関係は project.xml 内の <dependencies> 要素に依存するライブラリを <dependency> 要素としてJarファイル分追加します。<dependency>要素は子要素を含んでおり、最低でも3つの要素を指定する必要があります。
なお、Mavenでは依存関係にあるJarファイルをリモートリポジトリ [2] より取得する仕組みになっており、<dependency>で追加したライブラリがローカルに存在しなければ、リモートリポジトリへ探索にいきます。
リモートリポジトリには、オープンソースの有名どころのライブラリはほとんど揃っています。またリモートリポジトリは、自前で構築してそちらからJarを取得するようにもできます。リモートリポジトリは maven.repo.remote でカスタマイズ可能です。
<dependency>の設定
依存関係を指定するdependency要素の子要素について解説します。
dependencyの子要素:
- groupId
- groupIdはJarのグループを指定します。具体的にはリモートリポジトリ直下のディレクトリ名になります。例えばJakartaのcommons-collectionを依存関係に含めたい場合には、 <groupId>commons-collection</groupId> と指定します。
- artifactId
- artifactId はバージョン番号を除いたJarファイルの名称を指定します。commons-collection の場合には、groupIdと同様に <artifactId>commons-collection</artifactId> と指定します。他のライブラリの場合には、groupに複数のJarファイルが含まれていることもあるので、その場合には groupId と異なる名前を指定することになります。具体的には、グループディレクトリ内のjarsディレクトリ配下にあるJarファイルを指します。
- version
- versionはライブラリのバージョンを指定します。依存関係に含めるライブラリは、特に指定しない限り、[artifactId]-[version].jar という規則に従っている必要があります。 [3]
groupId、artifactId、versionを使用して、www.ibiblio.org にある commons-collections-3.0.jar を依存関係に含めたい場合には、次のように記述します。
[依存関係を追加する]:
<dependencies> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.0</version> </dependency> </dependencies>
依存関係にリモートリポジトリに存在しない自前のJarファイルを含めたい場合には、ちょっとした手間が必要です。無難なのは、リモートリポジトリを自前で用意する方法です。ただしこの場合ですと、リポジトリサーバが必要になるなどの手間がかかります。プロジェクトを通してMavenを採用していくならまだしも、ちょっとMavenを使ってみたいだけの方にはややオーバースペックです。本稿で紹介するもう1つの方法は「ローカルリポジトリに自前Jarファイルを登録する方法」です。
ローカルリポジトリへの登録
ローカルリポジトリとは、「リモートリポジトリから取得したライブラリをキャッシュしておくローカルのディレクトリ」のことです。Mavenのデフォルトローカルリポジトリは、 $HOME/.maven/repository となっています。既にMavenを実行している方はローカルリポジトリを覗いてみてください。ローカルリポジトリはちょうど、リモートリポジトリと同じようなディレクトリ構成になっています。
ここに自前のライブラリである「hoge-0.1.jar」を登録するために、次のようなディレクトリ構成にして配置します。以降は、hoge-0.1.jarを依存関係に追加しても、ネットワークに取得しにいくこともなく、問題なく動作します。
[ローカルリポジトリへのJar登録]:
$HOME/.maven/repository/ - hoge/ - jars/ - hoge-0.1.jar
■ test:compile
このゴールは project.xml に設定してあるユニットテストディレクトリ配下のテストコードをコンパイルします。ユニットテストディレクトリは project.xml の <unitTestSourceDirectory> で指定します。クラスファイルの出力先はl java:compile とは異なり、 target/test-classes となっています。出力先を変更したい場合は、project.xml に maven.test.dest を設定します。
■ clean
このゴールは ディレクトリ ${maven.build.dir} を削除します。クラスファイルだけでなく、生成したドキュメントなども全て削除してしまいますので注意してください。
■ test:test
このゴールは、test:compile で説明した、<unitTestSourceDirectory> 配下のテストケースを実行します。その際、全テストケースを実行する点に注意してください。テスト実行後には、 target/test-reports 配下にテストレポートをXML、Text形式で出力します。この出力結果は後で説明するテストレポートのHTML出力に使用することになります。なお、test:testゴールは、testゴールでも実行することができます。test:testゴールを実行すると、自動的にtest:compileを実行するため、明示的にtest:compileをしなくても構いません。
■ test:match
このゴールは -Dtestmatch=[パターン] で指定したパターンに合致するテストケースのみを実行対象とします。パターンはAntのfilesetなどで使用するパターンを同様です。なお、デフォルトで全ディレクトリの全拡張子が対象になっているため、指定するパターンはテストケース名のパターンだけで結構です。
test:match実行の例:
$ maven -Dtestmatch=*Factory* test:match (全パッケージの〜Factory〜というテストケースを実行する)
■ 今回のまとめと次回予告
今回はビルド、テスト実行といったMavenの基本的なゴールについて解説しました。次回はMavenの機能の中でも、特に重要なサイトレポートについて解説する予定です。
[1] | デフォルトのリモートリポジトリは http://www.ibiblio.org/maven/ です。 |
[2] | targetディレクトリは maven.build.dir でカスタマイズ可能です。 |
[3] | [名称]-[バージョン].jar という形式でなくとも指定することは可能ですが、一般的ではないためここでは説明しません。 |