3. Maven 入門 (2)
2006.06.28 株式会社四次元データ 鈴木 圭
- 3.1. 依存性について
- 3.1.1. 依存性の指定とスコープ
- 3.1.2. groupId, artifactId, version に指定する値の調べ方
- 3.1.3. 実際に依存性の指定を行う
- 3.1.4. ライブラリをローカルリポジトリにインストールする
- 3.2. プラグインについて
- 3.2.1. プラグインの設定方法
- 3.2.2. プラグインの情報の調べ方
- 3.2.3. 実際にプラグインの設定を行う
- 3.3. リモートリポジトリの設定方法
- 3.3.1. リモートリポジトリの種類
- 3.3.2. リモートリポジトリの設定
- 3.4. マルチモジュール・プロジェクト
- 3.4.1. プロジェクトを作成する
- 3.4.2. 親プロジェクトの設定
- 3.4.3. 各モジュールの設定
- 3.5. まとめ
今回は、プロジェクトの依存するライブラリの指定方法やプラグインの設定方法など、Maven を利用した開発に必要不可欠な事柄に関する説明を行います。また、一歩踏み込んだ内容として、リモートリポジトリと、マルチモジュール・プロジェクトについての説明を行います。
3.1. 依存性について
Maven の大きな機能の一つとして、依存性の管理が挙げられます。
Maven はプロジェクトの依存するライブラリを自動的にダウンロードし、必要なときにクラスパスの設定を行います。そのため、Maven を用いた開発では、プロジェクトを作成するたびに、ライブラリを一つひとつ手作業でダウンロードする必要はありません。
前回述べたとおり、ライブラリのダウンロードはリモートリポジトリ(デフォルトでは Maven の セントラルリポジトリ) から行われます。必要とするライブラリがリモートリポジトリに存在しない場合や、存在しても必要とするバージョンのものが無い場合は、ライブラリを手作業でダウンロードし、ローカルリポジトリにインストールしなければなりません。マイナーなライブラリや、ライセンスの関係で再配布できないライブラリに関してはこの作業が必要となります。
ライブラリを手作業でインストールする作業は少々面倒ですが、ローカルリポジトリのライブラリはローカルにあるプロジェクトで共有されるので、何度も行う必要はありません。
個々のプロジェクトは、必要なライブラリの情報を pom.xml に記述しておくだけです。
3.1.1. 依存性の指定とスコープ
プロジェクトが依存するライブラリを指定するには、project/dependencies の入れ子として dependency 要素を追加することで行います。プロジェクト作成直後では JUnit への依存性の指定が行われています:
<project ...> ... <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
dependency 要素を加えることにより、プロジェクトのビルドの適切な時点でライブラリのダウンロードや、クラスパスへの追加が行われるようになります。
dependency の子要素には groupId, artifactId, version, scope を指定することができます。groupId, artifactId, version は依存するライブラリのものを指定します。
また、version に関しては範囲で指定することもできます。指定の仕方は数学における範囲の指定と同じく「1.0 以上 2.0 未満」の場合は「[1.0, 2.0)」、「1.0 以上 2.0 以下」の場合は「[1.0, 2.0]」という具合に指定することができます。また、範囲の下限や上限を設けない「[, 2.0]」や「[1.0, ]」という指定の仕方もできます。
scope には、依存するライブラリがいつクラスパスに追加されるかを指定するものです。上の JUnit の例では scope に「test」が指定されています。これはテストコードのコンパイルおよび実行をするときにだけJUnit のライブラリがクラスパスに追加されることを意味します。scope に指定できる値とその意味は以下の通りです:
compile | scope の指定を省略した場合のデフォルト値です。全ての状況でクラスパスに追加されます。 |
provided | ライブラリが JDK やコンテナによって提供される場合に指定します。コンパイル時のみクラスパスに追加されます。 |
runtime | 実行時のみに必要な場合に指定します。テストの実行および通常の実行のときにクラスパスに追加されます。 |
test | テストのときのみ必要な場合に指定します。テストのコンパイルと実行のときにクラスパスに追加されます。 |
system | 明示的にクラスパスに追加する場合に指定します。このスコープのライブラリは常に有効であるとみなされ、リポジトリの検索は行われません。 |
「provided」は servlet-api.jar のような実行環境で提供されるライブラリに対して指定します。
「runtime」は、JDBC ドライバのような、実行するときだけ必要となるライブラリに対して指定します。
「system」はあまり一般的なスコープではありません。scope に system を指定すると、Maven はそのライブラリが常に有効であるとみなします。リポジトリの検索は行われないので、明示的にライブラリのパスを与えなければなりません。例えば、JDK に含まれているライブラリ (%JAVA_HOME%\lib に含まれる JAR ファイル)を使用する場合に指定します。
[注釈] Maven1 と Maven2 の依存性の扱い違い
Maven1 から Maven2 へのバージョンアップに伴い、推移的な依存性(依存しているライブラリが依存しているライブラリ) が適切に扱われるようになりました。
例えば、作成しているプロジェクトが A.jar に依存し、A.jar が B.jar に依存している場合、Maven1 では dependency に A.jar と B.jar の両方を指定する必要がありましたが、Maven2 では dependency に A.jar だけを指定すれば、B.jar への依存性も自動的に解決されるようになりました。
3.1.2. groupId, artifactId, version に指定する値の調べ方
プロジェクトが依存するライブラリは、リモートリポジトリかローカルリポジトリに存在しなければなりません。そして、groupId や artifactId, version にはリポジトリに登録されている情報と同じものを指定します。
Maven ではデフォルトのリモートリポジトリとしてhttp://repo1.maven.org/maven2が指定されていますので、groupId や artifactId に指定する値は、通常ここから探すことになります。
ブラウザで http://repo1.maven.org/maven2にアクセスすると、多くのライブラリが登録されていることが分かると思います。量が多いだけに、ブラウザを用いて目的のライブラリまでたどり着くのは時間がかかりそうです。
そこで、「Maven Repo Search」というサービスを利用します:
Maven Repo Search は Maven のライブラリやプラグインを検索するための Web サービスであり、キーワードを与えると、それに該当するライブラリやプラグインの情報を表示してくれます。