EclipseでApache Ivyの利用 - 基本編(1) -

Apache Ivyとは

プロジェクトの依存関係を管理するためのツール。
antとの親和性が高く、antに組み込む形で利用できる。
よくMavenと比較されているようだが自分はMavenの利用経験がない為Mavenとの比較はここでは述べない。

情報名 情報へのリンク
公式サイト http://ant.apache.org/ivy/
ダウンロード http://ant.apache.org/ivy/download.cgi
公式リファレンス http://ant.apache.org/ivy/history/latest-milestone/reference.html
Eclipseプラグイン IvyDE
ライセンス Apache License 2.0

Apache Ivyの主な機能

Apache Ivyのインストール

事前条件
  • Antが既にインストールされており、利用経験があること。
  • Eclipseでの開発環境が整っていること。
インストール
  1. http://ant.apache.org/ivy/download.cgi よりbinaryファイルをダウンロードし、任意のディレクトリに解凍する。
    (執筆時点での最新はapache-ivy-2.1.0-bin.tar.gz)
  2. Eclipseを起動し、メニューバーから下記を選択
  3. ウィンドウ → 設定 → Ant → ランタイム → 「クラスパス」のタブを選択
  4. 「外部JARの追加」→先ほど解凍したディレクトリ直下に存在するivy-2.1.0.jarを指定
  5. 「適用」を押下で完了

これでインストールは完了。

Apache Ivyの利用

以下のような構成のプロジェクトがあったとする。

ディレクトリ名 内容
src/ ソースディレクト
lib/ 依存JARライブラリ
bin/ eclipseのビルド出力フォルダ

lib配下のjarは以下の2つ。

  • commons-lang-2.4.jar
  • json-lib-2.3-jdk13.jar
1.ivy.xmlを書く

ivyの設定ファイル。依存関係をここに書く。
ivyはデフォルトでMavenのセントラルリポジトリに対応している為、http://mvnrepository.com/から必要なライブラリを検索してjarを探す。
例えばjson-libなら、json-libで検索するとhttp://mvnrepository.com/artifact/net.sf.json-lib/json-libが見つかるため、そのPOM Dependencyの項目を参考に以下のivy.xmlを記述する。

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
    xmlns:e="http://ant.apache.org/ivy/extra">
    <info organisation="valice" module="sample-ivy" />
    <dependencies>
        <dependency org="commons-lang" name="commons-lang" rev="2.0" />
        <dependency org="net.sf.json-lib" name="json-lib" rev="2.3" />
    </dependencies>
</ivy-module>

使用したタグの解説

項目名 説明
info このivy.xmlの基本情報
info@organisation モジュールの所有者、企業、機構
info@module モジュール名
dependency 依存モジュールの宣言
dependency@org pomのgroupId
dependency@name pomのartifactId
dependency@rev pomのversion
2.build.xmlを書く

ivyはantのtargetとして実行できるため、build.xmlを書く。
今回はivyのみを使う非常にシンプルなものを容易。

<?xml version="1.0" encoding="UTF-8"?>
<project name="ivy-sample" default="retrieve" basedir="."
    xmlns:ivy="antlib:org.apache.ivy.ant">

    <target name="retrieve">
        <ivy:retrieve />
    </target>

</project>
3.Antを実行する

今回はとりあえず簡単に使ってみることが目的の為、以上で完了。
後は上記antのretrieveを実行すればOK。実行すると、libフォルダが作成され(デフォルト)、依存jarがそこに配置される。
初めて実行するときはMavenのセントラルリポジトリから依存ライブラリ群をダウンロードする為時間がかかるが、2回目以降はローカルフォルダにキャッシュされている為すぐに完了する。


json-libで問題発生
だが自分はここでちょっとハマりました。
json-libの依存が上手く解決できず、json-lib-2.3.jarがダウンロードされない。
http://mvnrepository.com/artifact/net.sf.json-lib/json-lib
設定は確実にあっているはずだけれど、エラー内容で表示されるリポジトリを覗くと確かにjson-lib-2.3.jarなんてものはなく、-jdk13や-jdk15とかついているものしかない。
google先生に色々尋ねていたら、原因らしきものをmaven系のエントリで発見。
json-libは普通にdependencyに足すだけだとダウンロードに失敗する件 - tanamonの日記
ivyでclassifierを指定する為には、artifact要素の拡張属性を使用する必要があるらしいので、ivy.xmlの内容を下記の様に修正。

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
    xmlns:e="http://ant.apache.org/ivy/extra">
    <info organisation="valice" module="sample-ivy" />
    <dependencies>
        <dependency org="commons-lang" name="commons-lang" rev="2.0" />
        <dependency org="net.sf.json-lib" name="json-lib" rev="2.3">
            <artifact name="json-lib" type="jar" ext="jar"
                e:classifier="jdk13" />
        </dependency>
    </dependencies>
</ivy-module>

修正内容は、json-lib用のdependencyにartifactを加えたことと、拡張属性の名前空間(xmlns:e="http://ant.apache.org/ivy/extra)の追加。
これで成功。
ただ…json-libが実行時には必要の無い依存jarまで大量に落としてくるので、libが凄いことに…。
絶対どうにかできるハズなので、次回の調査対象。

簡単なサンプルbuild.xml

今回のivyをコンパイルの工程に加えた簡単なサンプルbuild.xmlを作成。
たぶん普通はlib自体を消してそこに再配置とかしないのだろうけど、とりあえずサンプルとして。
これでコンパイルの度に依存を解決してくれる。

<?xml version="1.0" encoding="UTF-8"?>
<project name="sample-api" default="all" basedir="."
    xmlns:ivy="antlib:org.apache.ivy.ant">

    <!-- set property -->
    <property name="bin" value="${basedir}/classes" />
    <property name="build" value="${basedir}/build" />
    <property name="src" value="${basedir}/src" />
    <property name="lib" value="${basedir}/lib" />
    <property name="version" value="0.10" />


    <!-- default target -->
    <target name="all" depends="compile,jar,clean" />

    <!-- init -->
    <target name="init" depends="clean">
        <mkdir dir="${bin}" />
        <mkdir dir="${build}" />
    </target>

    <!-- compile -->
    <target name="compile" depends="init,retrieve">
        <javac srcdir="${src}" destdir="${bin}">
            <classpath>
                <fileset dir="${lib}">
                    <include name="**/*.jar" />
                </fileset>
            </classpath>
        </javac>
    </target>

    <!-- clean -->
    <target name="clean">
        <delete dir="${bin}" />
        <delete dir="${build}" />
        <delete dir="${lib}" />
    </target>

    <!-- jar -->
    <target name="jar" depends="compile">
        <jar jarfile="${build}/sampleoapi-${version}.jar" basedir="${bin}" />
    </target>

    <target name="retrieve">
        <ivy:retrieve />
    </target>

</project>

次回予告

次回は基本編(2)として、ivyの設定ファイル、Mavenのセントラルリポジトリ以外を利用する方法と、利用できる要素と属性値の調査を行う予定。