2007-10-21

Mavenプロジェクトで3rdパーティJARを扱う方法

テーマ:Maven
 最近北欧よりの記事ばっかりだったので、Mavenネタを1つ。Mavenプロジェクトでスマートに3rdパーティJARを扱う2通りの方法を説明する。

 Mavenの最大の利点の1つに、依存JARライブラリがローカルPC上の中央リポジトリで管理され、プロジェクト毎の管理が必要ないという特徴がある。しかし、利用したいライブラリがオープンソース(OSS)でなかったり、OSSでも非常にマイナーなものだったりすると、リモートリポジトリに無くて使えない。
 この場合によく説明されるのが、以下のようにしてJARをローカルリポジトリに手動でインストールする方法だが、チームで開発しているときに、この作業をメンバひとりひとりにやらせるのは非常に格好が悪い。
> mvn install:install-file -Dfile=<JARへのパス> ...
かといって、Antの時代に戻ってプロジェクトの lib フォルダの下にJARを直接置くとすると、今度はIDE(たぶんEclipse?)のクラスパス設定(.classpathなど)もSubversionで構成管理しなければならない上、mvn eclipse:eclipse を実行したときはクラスパス設定はクリアされてしまうので、その度にまたIDE上でクラスパス設定をしなければならない。めんどうくさい・・・

 以下2つのいずれかの方法を採用すれば、もっとスマートに3rdパーティJARを扱うことができる(個人的には、2番目の方法がオススメ)。
(1) プロジェクト内にMavenリポジトリを作る
(2) system スコープと ${basedir} を使う

(1) プロジェクト内にMavenリポジトリを作る
 まず最初に紹介するのは、プロジェクトの中にリモートにあるのと同じMavenリポジトリを作ってしまう方法。(ここでは、Sunが提供する activation.jar を3rdパーティJARの例として説明する)
my-project
 +-- src/
 +-- m2repo/
   +-- javax/activation/activation/1.1/
     +-- activation-1.1.jar
     +-- activation-1.1.pom
 +-- pom.xml
リポジトリのレイアウトや pom ファイルの書き方は、ローカルリポジトリなどを参考にする。m2repo フォルダおよびそれ以下のJARライブラリは、Subversionにつっこんで構成管理する。
 pom.xml では、以下のようにしてこのプロジェクト内リポジトリを参照先リポジトリの1つに加える。
[pom.xml]
<project>
 ...
 <repositories>
  <repository>
   <id>local</id>
   <url>file:m2repo</url>
  </repository>
 </repositories>
こうすることで、m2repo フォルダ以下に置かれたJARは通常のJARと同じように pom.xml の依存設定に書けるようになる。

(2) system スコープと ${basedir} を使う
 もう1つの方法は、pom.xml の依存JAR設定にある system スコープと変数 ${basedir} を利用する方法。
[pom.xml]
<project>
 ...
 <dependencies>
  <dependency>
   <groupId>javax.activation</groupId>
   <artifactId>activation</artifactId>
   <version>1.1</version>
   <scope>system</scope>
   <systemPath>${basedir}/lib/activation.jar</systemPath>
  </dependency>
 </dependencies>
${basedir} はMavenプロジェクトのルートパスを表す変数。system スコープは本来、JREなどのシステムが元々持っているJARをMavenから参照するための仕組みで、<systemPath>でJARのパスを直接指定できる。それを悪用(?)して上記のように書いてしまうことで、Ant時代と同じようにプロジェクト内でJARを管理して使うことができる。
 当然ながら3rdパーティJARは、プロジェクトの lib フォルダ以下に置いてSubversionにつっこむこと。
my-project
 +-- src/
 +-- lib/
   +-- activation.jar
 +-- pom.xml
 (2)は(1)の方法に比べると非常にお手軽なのだが、本来の system スコープの使い方をしていないようで、少し邪道な気配がしないでもない。

 (1)、(2)どちらの方法にしても、JARをSubversionにつっこんでいる点ではAnt時代と同じだが、プロジェクトの管理はMavenに一元化され、最初に mvn eclipse:eclipse をやればいいだけになる。mvn install:install-file を各自が実行しなければいけなかったり、mvn eclipse:eclipse の度にEclipseのクラスパスを設定し直さなければならなかったりと、チームメンバに煩わしい手順を強制する必要性は完全に排除できる。

※ この記事はあくまで技術的な方法について説明しているだけであり、ライセンス上の問題として、3rdパーティJARをSubversionなどで構成管理してチームで共有してもいいかどうかについては、各自で確認してもらいたい。



AD
いいね!した人  |  コメント(1)  |  リブログ(0)

コメント

[コメントをする]

1 ■無題

(2)だとprovided相当なので、WARの /WEB-INF/lib に置きたい時なんかは(1)でやるしかないですね。

コメント投稿

AD

Ameba人気のブログ

Amebaトピックス

      ランキング

      • 総合
      • 新登場
      • 急上昇
      • トレンド

      ブログをはじめる

      たくさんの芸能人・有名人が
      書いているAmebaブログを
      無料で簡単にはじめることができます。

      公式トップブロガーへ応募

      多くの方にご紹介したいブログを
      執筆する方を「公式トップブロガー」
      として認定しております。

      芸能人・有名人ブログを開設

      Amebaブログでは、芸能人・有名人ブログを
      ご希望される著名人の方/事務所様を
      随時募集しております。