Maven2チュートリアル(2) 依存ライブラリ

前回に引き続いてMaven2チュートリアルです。今回は肝となる依存ライブラリの設定方法になります。NetBeansを使う事で追加や依存関係のグラフィカル表示が可能になります。

パッケージ管理システム

JavaではRubygemsのようなパッケージ管理システムはありません。これはJavaでは拡張ライブラリをJavaのパスに含めず各アプリケーション毎に管理する方が望ましいと考えるため、コマンド1つで共通のライブラリとしてインストールする方法は合わないからともいえます。しかし、Maven2を使えばプロジェクト毎に依存ライブラリの管理を行うことができます。
例えばプロジェクトでロギング用の拡張ライブラリとしてcommons-loggingを使う事になったとします。Maven2を使わない場合、Apache Software Foundationのサイトを訪れ、jarをダウンロードして実行時のパスに追加します。この作業は手間です。また、個々の開発環境で行うかSCMなどを用いて各開発環境に展開する必要があります。
さらに依存関係の問題もあります。あるライブラリが別のライブラリに依存することはよくある為、使いたいライブラリを使うには何が必要かをチェックする必要があるのです。

Maven2の依存ライブラリ設定

Maven2ではビルドなどの自動化が大きな役割ですが、もう1つの大きな役割として依存関係を含めたパッケージの管理があります。Maven2の設定ファイルに使用したいライブラリを記述することで、必要なときに設定されたライブラリをダウンロードする仕組みが提供されています。
Maven2Rubygemsなどと大きく異なるのは、依存関係の設定や解決がプロジェクト単位であるということです。ただし、ダウンロードされたライブラリはローカルリポジトリと呼ばれる共通の場所に保存されます。

dependencies

pom.xmlの中にdependenciesという要素があります。dependenciesには任意の数のdependencyを含めることができます。
まずはプロジェクト作成時デフォルトで含まれている単体テスト用のライブラリJUnitの設定を確認しましょう。

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

groupId, artifactId, versionは前回のエントリーでプロジェクトを作成したときに決めたものと同じ性質のものです*1。ここからプロジェクトの依存ライブラリとしてjunit3.8.1が登録されていることが読み取れます。

groupId, artifactId, versionの調べ方

つまり、依存ライブラリを追加するにはgroupId, artifactId, versionが必要です。ライブラリによっては配布サイトやドキュメントの中にgroupId, artifactId, versionが記述されています。ドキュメント等にない場合、後述のセントラルリポジトリから検索します。

セントラルリポジトリ

Maven2ではpom.xmlに依存ライブラリを記述すれば自動的にプロジェクトにライブラリを追加してくれます。それらのライブラリはMaven2のセントラルリポジトリhttp://repo1.maven.org/maven2/)に置かれています。セントラルリポジトリはグループIDとアーティファクトIDで構造化されているので、適当に掘ってみてください。すると、maven-metadata.xml というファイルが見つかるはずです。
例) http://repo1.maven.org/maven2/commons-logging/commons-logging/maven-metadata.xml

<?xml version="1.0" encoding="UTF-8"?><metadata>
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.1.1</version>
  <versioning>
    <release>1.1.1</release>
    <versions>
      <version>1.0</version>
      <version>1.0.1</version>
      <version>1.0.2</version>
      <version>1.0.3</version>
      <version>1.0.4</version>
      <version>1.1</version>
      <version>1.1.1</version>
    </versions>
    <lastUpdated>20071128191817</lastUpdated>
  </versioning>
</metadata>

このファイルでgroupId, artifactIdとバージョンの一覧が確認できます。

その他のリポジトリ

最新のライブラリやマイナーなライブラリなどはセントラルリポジトリには含まれていません*2。また、スナップショットなどの最新版はそれぞれのプロダクトのリポジトリから取得できることがあります。このようにセントラルリポジトリ以外のリポジトリを使用する場合は、次のようにをrepositories要素を追加します。

  <repositories>
    <repository>
      <id>maven.seasar.org</id>
      <name>The Seasar Foundation Maven2 Repository</name>
      <url>http://maven.seasar.org/maven2</url>
    </repository>
    <repository>
      <id>java.net</id>
      <url>http://download.java.net/maven/1</url>
      <layout>legacy</layout>
    </repository>
    <repository>
      <id>dist.codehaus.org</id>
      <name>dist codehaus Maven2 Repository</name>
      <url>http://dist.codehaus.org/mule/dependencies/maven2</url>
    </repository>
  </repositories>
  <dependencies>
  </dependencies>

ここではSeasar Foundation、java.net、codehausの3つのリポジトリを追加しています。セントラルリポジトリになかったりライブラリのドキュメントにリポジトリを追加するような指示がある場合は追加してください。

NetBeansを使って依存ライブラリを追加する

このように依存ライブラリを追加するには結構な手間が必要ですが、NetBeansではライブラリの検索機能があるため、簡単に追加ができます。プロジェクトの「ライブラリ」を右クリックして「依存ライブラリの追加」を選択してください。

次にクエリーの所にライブラリの名前の一部を入力します。ここではloggingと入力してみました。

後は目指すライブラリを見つけ、バージョンを選択し、了解ボタンをクリックするだけです。

これで、dependenciesに追加されました。

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.1</version>
    </dependency>
  </dependencies>

尚、依存ライブラリが追加されるとただちにダウンロードが実行されるようです。また、ライブラリを展開していくと解りますが、ソースコードJavaDocも自動的にダウンロードされて設定されます。この機能は非常に便利です。

依存ソースのグラフ表示

ライブラリを右クリックした時に「依存ソースのグラフ表示」というメニューがあり、依存関係をグラフで表示可能です。色々とライブラリの依存関係が複雑になったならばここで整理してみましょう。

scope

最後にdependency要素にあるscope要素について解説します。scope要素にはcompile/provided/runtime/test/systemが設定可能です。この中でとりあえず覚えておくのはcompile/testです。

compile

compileはデフォルト設定でコンパイル時からアーカイブとして成果物を生成するまで依存ライブラリが使用されます。一般的なライブラリはcompileスコープとします。

test

testにした場合、テストにはその依存ライブラリを使用しますが、成果物の生成時には含まれないようになります。例えばJUnitなどのテスト用ライブラリはtestスコープとなるでしょう。

まとめ

Maven2を使う事で依存ライブラリを管理する事ができます。とはいえ、簡単に…とはいきません。ある程度は設定ファイルで補うことはできますが、バージョンや依存関係などに関しては設定する人にスキル(知識)が必要です。また、NetBeansを使えば依存ライブラリの検索が楽なのでpom.xmlの管理の為に使うのもありでしょう。

*1:ただし、過去の経緯からgroupIdがパッケージ名になっていないライブラリも多いです

*2:手続きや反映に時間がかかるようです