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の主な機能
- ライブラリの依存関係の管理
- Antのtargetの一つとして実行可能
- 依存関係をレポートとして出力(HTML)
- Mavenリポジトリ(http://mvnrepository.com/)の利用
- リポジトリのキャッシュ管理
Apache Ivyのインストール
事前条件
- Antが既にインストールされており、利用経験があること。
- Eclipseでの開発環境が整っていること。
インストール
- http://ant.apache.org/ivy/download.cgi よりbinaryファイルをダウンロードし、任意のディレクトリに解凍する。
(執筆時点での最新はapache-ivy-2.1.0-bin.tar.gz) - Eclipseを起動し、メニューバーから下記を選択
- ウィンドウ → 設定 → Ant → ランタイム → 「クラスパス」のタブを選択
- 「外部JARの追加」→先ほど解凍したディレクトリ直下に存在するivy-2.1.0.jarを指定
- 「適用」を押下で完了
これでインストールは完了。
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>