Mar 10, 2009

[Maven] 何かに依存するライブラリを使用する

たまに「何かに依存するライブラリ」というものがある。 例えば、JDK のバージョンに依存する json-lib。 例えば、OS に依存する Eclipse SWT。
この様なライブラリは groupId, artifactId, version 以外の属性で jar を切り替えるものと考えることができる。 素晴らしいことに Maven2 ではこの様な状況も想定し、classifier という属性が用意されている。 pom.xml に classifier を指定することで「依存する何か」で jar を切り替えることができる。

Maven Documentation - Technical Project Descriptor
http://maven.apache.org/ref/current/maven-model/maven.html#class_dependency

pom.xml の記述方法

pom.xml の dependency に classifier を指定するだけで良い。 OS 毎に Eclipse SWT を切り替える場合は以下の様になる。 ちなみに、http://repo1.maven.org/maven2/ にはこの例の jar は登録されていない。

  <project>
    <dependencies>
      <dependency>
        <groupId>org.eclipse.swt</groupId>
        <artifactId>swt</artifactId>
        <version>3.4</version>
        <classifier>carbon-macosx</classifier>
        <scope>compile</scope>
      </dependency>
    </dependencies>
  </project>


properties を使用すると設定が楽になる。
  <project>
    <properties>
      <swt-classifier>carbon-macosx</swt-classifier>
    </properties>
    <dependencies>
      <dependency>
        <groupId>org.eclipse.swt</groupId>
        <artifactId>swt</artifactId>
        <version>3.4</version>
        <classifier>${swt-classifier}</classifier>
        <scope>compile</scope>
      </dependency>
    </dependencies>
  </project>

リモートリポジトリの構成

リモートリポジトリのディレクトリ構成、pom.xml は classifier 無しのものと同じ。 異なるのは jar ファイルが classifier 毎に複数用意されるというところ。 jar ファイル名は <artifactId>-<version>-<classifier>.jar となる。 上の Eclipse SWT の例の jar を登録する場合、下記の様な構成となる。

  $REPOSITORY_HOME
    └ org
       └ eclipse
           └ swt
              └ swt
                 └ 3.4
                    ├ swt-3.4.pom
                    ├ swt-3.4-carbon-macosx.jar
                    └ swt-3.4-gtk-linux-x86.jar

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |