Maven2では、1つの成果物(=artifact/アーティファクト、jar/warファイルなど)を管理するために1つの「プロジェクト」が対応します。
このプロジェクトは、1つのpom.xmlファイルと、原則として決まった構成のディレクトリ群からできています。
以下では、pom.xmlファイルの基本とそれぞれのディレクトリについて、またMaven2の基本的なコマンドについて見ていきます。
このプロジェクトは、1つのpom.xmlファイルと、原則として決まった構成のディレクトリ群からできています。
+ project + src + main + java + resources ( + webapp ) + test + java + resources + target + classes + test-classes - pom.xml
以下では、pom.xmlファイルの基本とそれぞれのディレクトリについて、またMaven2の基本的なコマンドについて見ていきます。
pom.xml
pom.xmlは、Maven2管理プロジェクトの設定をすべて引き受けているファイルです。このファイルに様々な設定を追加することで、便利なMaven2プラグインや、依存ファイルの自動解決などの機能を利用することができます。
pom.xmlファイルに最低限必要な記述は以下のとおりです。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
</project>
Maven2の成果物は、groupId / artifactId / versionという3つのパラメータで1元的に表されます。
groupId
この成果物がどのグループに所属するのかを示します。基本的には、Javaのパッケージ名と同じ命名規則により、この成果物が利用するベースパッケージ名と同じものが使われることが多いです。
組織でつける場合には、その組織やサービスで利用できるパッケージ名(組織やサービスのドメイン名を逆順で並べたもの)+α(案件名など)を使うことになります。
例えば、
st.happy_camper.sample
など。artifactId
この成果物の名称を示します。当該グループ内で意味を持つ一意の名称をつけます。groupIdに案件名を付加している場合には、artifactIdの接頭語としてもつけておいた方が名前の衝突がなくていいと思います。
成果物の物理ファイル名の一部として利用されます。
例えば、
sample-dao
/ sample-logic
/ sample-webapp
など。version
この成果物のバージョンを示します。${majorVersion}.${minorVersion}.${buildVersion}(-SNAPSHOT)
というバージョンを使うことが多いようです。SNAPSHOT
は、次のバージョンへ向けての途中段階という特別なバージョンで、開発をしている側のためのバージョンです。利用側はSNAPSHOT
のついていないバージョンを利用することになります。ディレクトリ構成
Maven2プロジェクトでは、上記で示したように、原則としてディレクトリ構成が固定されています。(pom.xmlの設定によって変更することは可能です。)src/main/java
Javaのソースファイルを格納するためのディレクトリです。成果物には、このディレクトリ内のクラスが含まれます。
src/main/resources
ソースファイルではない設定ファイルなどを格納するためのディレクトリです。成果物には、このディレクトリ内のファイルが含まれます。
src/main/webapp
pom.xmlの設定packagingをwarにした場合に利用されるWebアプリ用のファイルを格納するためのディレクトリです。src/main/webapp/WEB-INF/web.xml ファイルは必須です。
src/test/java
JUnitなどのテスト用のJavaファイルを格納するためのディレクトリです。テストフェーズではこのディレクトリ内のテストが実行されますが、成果物にはこのディレクトリ内のクラスは含まれません。
src/test/resources
テストで利用する設定ファイルなどを格納するためのディレクトリです。テストフェーズではこのディレクトリ内のファイルを利用することができますが、成果物にはこのディレクトリ内のファイルは含まれません。
target
Maven2によって生成された結果を格納するためのディレクトリです。mainのJavaファイルコンパイル結果(→target/classes)、testのJavaファイルコンパイル結果(→target/test-classes)、最終成果物などが格納されます。
Maven2のコマンドによって自動生成されるので、SCMを利用している場合にはこのディレクトリは管理対象外にすべきです。
フェーズ
Maven2では、Javaプログラムの構築手順としてフェーズという概念を持っています。Javaプログラムを構築する際には、ザックリいうと
- ソースコードを書く
- コンパイルする
- テストする
- パッケージングする(jar/warにまとめるなど)
これらの手順をフェーズといいます。
Maven2への指示は基本的にこのフェーズを元に行います。
compile
Javaプログラムをコンパイルし、関連するリソースがある場合にはコピーします。$ mvn compile
test
テストコードをコンパイル、関連するリソースがある場合にはコピーし、テストを実行します。前段の
compile
が終わっていない場合には事前にcompile
を行います。$ mvn test
package
クラスファイル、関連するリソースを収集してjar/warファイルを生成します。前段の
test
が終わっていない場合には事前にtest
を行います。$ mvn package
clean
targetディレクトリを削除します。$ mvn clean
それぞれのフェーズは並べることができ、Maven2は並べられた順番で各フェーズを実行していきます。
例えば
$ mvn clean package
とすると一旦targetを削除してから
package
を行う、という動作になります。余談ですが、これは一旦targetを削除して
package
で全体をコンパイルしなおすのでpackage
単体よりは重い処理になりますが、古いクラスファイルが残っていて動いているように見えることがあるため定期的にclean
することをお勧めします。