倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

dom4j を使うための POM ファイル

前回Maven2 上で dom4j が依存するライブラリを見ました。 今回は、具体的に POM ファイルを書いてみましょう(一覧)。

ここでは、以下の条件

  • 対象となる Java 事項環境は Java SE 1.4 以降(すなわち xml-api は依存性に入れない)
  • XPath を使う(すなわち jaxen を依存性に入れる)
  • StAX, JAXB は使わない

を満たすプロジェクトに対する POM ファイルを書きます。 手順は以下の通り:

  1. dom4j を依存性に入れる
  2. xml-api への依存性を除去する
  3. Jaxen を依存性に入れる
  4. Jaxen が依存している不必要な依存性を除去する
  5. コンポーネント

1. dom4j を依存性に入れる


まず、dom4j に依存性を入れた POM ファイルは次のようになります:

<?xml version="1.0"?>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sample</groupId>
  <artifactId>sample</artifactId>
  <version>1.0</version>

  <dependencies>
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
    </dependency>
  </dependencies>
</project>

2. xml-api への依存性を除去する


次に、xml-api への依存性を除去します。 これには、<dependency> 要素の子要素に <exclusions> 要素を入れます:

<?xml version="1.0"?>
<project>
  <!-- modelVersion, groupId, artifactId, version -->

  <dependencies>
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
      <exclusions>
        <exclusion>
          <groupId>xml-api</groupId>
          <artifactId>xml-api</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</project>

XPath を使わないなら、これだけで OK です。

3. Jaxen を依存性に入れる


XPath 関連のメソッド等を使えるようにするために、Jaxen への依存性を入れましょう。 dom4j-1.6.1 の POM ファイルには jaxen-1.1-beta-6 に依存すると書いてますが、最新バージョンの jaxen-1.1.1 を使うことにします*1

<?xml version="1.0"?>
<project>
  <!-- modelVersion, groupId, artifactId, version -->

  <dependencies>
    <!-- dom4j-1.6.1 への依存性 -->

    <dependency>
      <groupId>jaxen</groupId>
      <artifactId>jaxen</artifactId>
      <version>1.1.1</version>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
</project>

Jaxen は実行時にのみ必要なので、"runtime" スコープにしてあります。 これで終わりっぽいですが、残念ながらもう少し付け加えなければいけないことがあります。

4. Jaxen が依存している不必要な依存性を除去する


何故そうなっているのか分かりませんが、Jaxen は JDOM, dom4j, XOM などに "compile" スコープの依存性が入っています。 かなり特殊な場合でない限り、これら3つのライブラリを同時に使うことはあり得ないので、単なる POM ファイルの書き間違いでしょう。 使う側にするとエラク迷惑ですが。

したがって、Jaxen から間接的に依存関係のあるライブラリを除去してしまいましょう。 チョット長くなりますが。

<project>
  <!-- modelVersion, groupId, artifactId, version -->
    
  <dependencies>
    <!-- dom4j-1.6.1 への依存性 -->

    <dependency>
      <groupId>jaxen</groupId>
      <artifactId>jaxen</artifactId>
      <version>1.1.1</version>
      <scope>runtime</scope>
      <exclusions>
        <exclusion>
          <groupId>xml-apis</groupId>
          <artifactId>xml-apis</artifactId>
        </exclusion>
        <exclusion>
          <groupId>xerces</groupId>
          <artifactId>xercesImpl</artifactId>
        </exclusion>
        <exclusion>
          <groupId>jdom</groupId>
          <artifactId>jdom</artifactId>
        </exclusion>
        <exclusion>
          <groupId>xom</groupId>
          <artifactId>xom</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</project>

これで完了です。

5. コンポーネント


毎回上記の POM ファイルを書くのは面倒なので、もう少し再利用が簡単なようにしておきましょう*2。 それにはまず、上記の POM ファイルの依存性を持った、別のプロジェクトを作成します。 ただし、<project> 要素直下に <packaging> 要素を(子テキストを "pom")にして付け加えます:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>waman.dependency</groupId>
  <artifactId>dom4j</artifactId>
  <!-- ここを新たに追加 -->
  <packaging>pom</packaging>
  <version>1.0</version>
  <name>dom4j dependency</name>
    
  <dependencies>
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
      <exclusions>
          <exclusion>
              <groupId>xml-apis</groupId>
              <artifactId>xml-apis</artifactId>
          </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>jaxen</groupId>
      <artifactId>jaxen</artifactId>
      <version>1.1.1</version>
      <scope>runtime</scope>
      <exclusions>
        <exclusion>
          <groupId>jdom</groupId>
          <artifactId>jdom</artifactId>
        </exclusion>
        <exclusion>
          <groupId>xml-apis</groupId>
          <artifactId>xml-apis</artifactId>
        </exclusion>
        <exclusion>
          <groupId>xerces</groupId>
          <artifactId>xercesImpl</artifactId>
        </exclusion>
        <exclusion>
          <groupId>xom</groupId>
          <artifactId>xom</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</project>

これを作成後、このプロジェクトをローカル・リポジトリにインストールします*3

次は、実際に開発を行うプロジェクトに、上で作成・インストールしたプロジェクトへの依存性を含めます:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sample</groupId>
  <artifactId>sample</artifactId>
  <version>1.0</version>
    
  <dependencies>
    <dependency>
      <groupId>waman.dependency</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.0</version>
      <type>pom</type>
    </dependency>
  </dependencies>
</project>

依存関係に指定する groupId, artifactId, version は上記で作成したプロジェクトのものです。 また、<dependency> 要素下に <type> 要素を指定していることに注意して下さい。 

以上で完了です。

Apache Maven 2.0入門 Java・オープンソース・ビルドツール

Apache Maven 2.0入門 Java・オープンソース・ビルドツール

*1:拙者の環境では特に動かなくなったりはしてません。

*2:Maven2 の正規の方法では、下記のようにするのではなく、親 POM ファイルを作成して、<dependencyManagement> 要素を使って依存性を管理します。 ただし、親 POM ファイルがどんどん複雑になっていくので、ここでは別の方法を挙げました。

*3:コマンド・プロンプトでルート・フォルダに移動し、コマンド "mvn install" を実行して下さい。