依存解決とレポジトリ

| # Comments | 3 Trackbacks
Maven2を使う上で最も便利な機能の内の1つに、依存関係の自動解決があります。

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ログインが必要になるので、あらかじめパスフレーズなしの鍵認証を設定しておけば、いちいちパスワードを入力しなくてもすむので便利です。

トラックバック(3)

Maven2のもう1つの有用な機能として、プロジェクトサイト生成機能があります。... 続きを読む

Happy-Camper Street - モジュール (2008年9月26日 01:01)

複数人のチームでの開発では、機能別やレイヤー別に担当者を分けて開発を行います。ユ... 続きを読む

昨日はPlay frameworkを使ってHello Worldが動きました。今... 続きを読む

comments powered by Disqus

Twitter Icon

AdSense

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。
Powered by Movable Type 5.14-ja

Google検索

カスタム検索

2013年10月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31