Maven2を使う上で最も便利な機能の内の1つに、依存関係の自動解決があります。
pom.xmlファイルに設定を記述しておくだけで、Maven2レポジトリと呼ばれるサーバーからライブラリファイルをダウンロードし、クラスパスに追加してくれるという機能です。
世界中で開発されている数多くのライブラリがセントラルレポジトリにデプロイされており、簡単に利用できるようになっています。
セントラルレポジトリ内のライブラリであれば、Maven Repository: Search/Browse/Exploreというサイトで検索でき、groupId / artifactId / versionを検索することができるようになっています。
他にも各地にレポジトリが公開されており、そちらにあるライブラリもレポジトリの設定を追加するだけで利用できるようになります。
それでは、それぞれの設定について見てみます。
pom.xmlファイルに設定を記述しておくだけで、Maven2レポジトリと呼ばれるサーバーからライブラリファイルをダウンロードし、クラスパスに追加してくれるという機能です。
世界中で開発されている数多くのライブラリがセントラルレポジトリにデプロイされており、簡単に利用できるようになっています。
セントラルレポジトリ内のライブラリであれば、Maven Repository: Search/Browse/Exploreというサイトで検索でき、groupId / artifactId / versionを検索することができるようになっています。
他にも各地にレポジトリが公開されており、そちらにあるライブラリもレポジトリの設定を追加するだけで利用できるようになります。
それでは、それぞれの設定について見てみます。
dependency
依存ライブラリのgroupId / artifactId / versionを指定することでプロジェクトで利用することができるようになります。pom.xmlファイルの例として、前回のsample-jarプロジェクトがjunitを利用する場合は以下のとおりです。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>st.happy_camper.sample</groupId>
<artifactId>sample-jar</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.5</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
依存ライブラリが、さらに他のライブラリに依存している場合には、それらも含めて利用できるようになります。
複数のライブラリを依存に含めたい場合には、
<dependency>
タグを並べて書きます。scopeとは
上記の例で、junitへの依存に対して<scope>test</scope>
を指定してあります。これはtestフェーズ(テストコードのコンパイルとテスト実行)でのみ利用します、ということを意味しています。
通常は省略することで
<scope>compile</scope>
をデフォルトとして指定したことになります。コンパイルから実行時まで必要です、という意味です。
他に良く使うscopeは
<scope>provided</scope>
です。Servlet APIのように、コンパイル時には必要だけど、実行時にはサーブレットコンテナ側が提供するので含める必要がない、という場合に指定します。
repository
依存ライブラリは、Maven2レポジトリと呼ばれるサーバーからダウンロードされます。デフォルトでは
セントラルレポジトリが利用されます。レポジトリは多数存在しており、セントラルレポジトリ以外からもライブラリを利用したい場合には、
<repository>
タグにより設定します。例えば、前回のsample-webappプロジェクトが、日本で最も大きなオープンソースコミュニティであるThe Seasar FoundationのMaven2レポジトリを利用する場合には、
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>st.happy_camper.sample</groupId>
<artifactId>sample-webapp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<repositories>
<repository>
<id>maven.seasar.org</id>
<name>The Seasar Foundation Maven2 Repository</name>
<url>http://maven.seasar.org/maven2</url>
</repository>
</repositories>
</project>
のように設定します。
複数のレポジトリを追加したい場合には、
<repository>
タグを並べて書きます。ちなみにレポジトリ上のディレクトリ構成は、
+ repository url + groupIdの.で区切ったディレクトリ階層 + artifactId + version
という構成になっています。
例えば、javax.servlet:servlet-api:2.5というライブラリは、http://repo1.maven.org/maven2/javax/servlet/servlet-api/2.5/にあります。
installとdeploy
自分で構築したライブラリを別のプロジェクトから利用したい場合には、installを行う必要があります。installとは、packageしたファイルをローカルレポジトリ(${HOME}/.m2/ ディレクトリ以下)にコピーして、他のプロジェクトから利用できる状態にすることです。
$ mvn install
また他の人にも共有したい場合には、独自のレポジトリを準備し、そこにdeployすることになります。
HTTP/FTP/NFSなどで全員がアクセスできるサーバーが必要です。
deploy先の設定は
<distributionManagement>
タグで行います。例えば、sample-jarをscpでmaven.repositoryサーバーへアップし、sample-webappから依存しているという状態であれば、
- sample-jar
pom.xml<project> <modelVersion>4.0.0</modelVersion> <groupId>st.happy_camper.sample</groupId> <artifactId>sample-jar</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <distributionManagement> <repository> <id>maven.repository</id> <name>Sample Maven2 Repository</name> <url>scp://maven.repository/path/to/public_html/maven2</url> <uniqueVersion>false</uniqueVersion> </repository> <snapshotRepository> <id>maven.repository</id> <name>Sample Maven2 SNAPSHOT Repository</name> <url>scp://maven.repository/path/to/public_html/maven2-snapshot</url> <uniqueVersion>true</uniqueVersion> </snapshotRepository> </distributionManagement> </project>
デプロイ$ mvn deploy
- sample-webapp
pom.xml<project> <modelVersion>4.0.0</modelVersion> <groupId>st.happy_camper.sample</groupId> <artifactId>sample-webapp</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <repositories> <repository> <id>maven.repository</id> <name>Sample Maven2 Repository</name> <url>http://maven.repository/maven2</url> </repository> <repository> <id>maven.repository</id> <name>Sample Maven2 SNAPSHOT Repository</name> <url>http://maven.repository/maven2-snapshot</url> </repository> </repositories> <dependencies> <dependency> <groupId>st.happy_camper.sample</groupId> <artifactId>sample-jar</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
sample-jar/pom.xmlにおいて、project/distributionManagement/snapshotRepositoryの設定は必須ではありませんが、正規のデプロイと
SNAPSHOT
のデプロイを分けておいた方が正規のレポジトリがスッキリするので設定しておいた方がいいでしょう。また、scpを利用するとdeploy時にサーバーへのSSHログインが必要になるので、あらかじめパスフレーズなしの鍵認証を設定しておけば、いちいちパスワードを入力しなくてもすむので便利です。