apache-Ivyという依存性解決のためのantプラグインがあって「Mavenよりも融通が効いていいツールだなあ」と思いながら使っていたのですが、日本語の情報が少なくて使い方が分からなくて往生する日々が続いていました。

最近やっと自分の中で使えるようになってきたかなーというくらいになってきたので、まとめてみようと思います。

ivy-lierre

apache-Ivyって何?

Javaライブラリの依存性を解決してくれるツールです。と言ってもよくわかりませんね。Javaでプログラミングするときにライブラリを使うじゃないですか、commons-langとか、log4jとか、Webアプリケーションだったらstrutsとかwicketとか?そーゆーのってオープンソースでインターネットに公開されていたりするので、入手するのは簡単なのですね。なので昔のプロジェクトとか規模の小さいプロジェクトだと、各々の開発者が勝手に追加していったりしていたんですが、それだとバージョン違いの同じライブラリがプロジェクトに混在してたりだとか、jarファイルがあるけどこいつのバージョンは一体いくつなんだぜ?とか、色々問題があったのです。

で、これは不味いなーと思った人たちが、プロジェクトで使用しているライブラリのリストを作って、バージョン番号も含めてリストで管理するようになりました。さらにライブラリの殆どはオープンソースで公開されているものなので、ライブラリのリストがあれば必要なものを自動的にインターネットから取得できるような仕組みを考えました。これにより、大容量の.jarファイル群はソースコード管理の対象から外れ、代わりにライブラリのリストを記した一枚のテキストファイルがソースコード管理の対象になりました。(説明のために勝手に物語を作ってしまいました。ホントのところはどうだか知りません。)

何がよいの?

上だけ読むと、ソースコード管理サーバーの容量が節約できてよかったねぇ。という内容しかないのですが、プロジェクトが必要とするライブラリをリストにしたら、他にも良いことがたくさんありました。

まず1つめ。ビルド工程を簡略化することができました。これまでアプリケーションのビルドは、職人がプロジェクトごとにオーダーメイドでシェルスクリプトを作成してそれを起動することで行われていましたが、職人が作成したシェルスクリプトは未来に追加されるであろうライブラリのことまでは考慮されていないケースが多く、新しく追加した.jarファイルにクラスパスが通っていないためにビルドが失敗して結合テスト環境が動かず作業が止まり「先輩カレー食いに行きましょうよ」な感じだったのです。話がそれました。職人がいなくてもプロジェクトのトップディレクトリにある「build.bat」をダブルクリックするだけで必要な.jarファイルを何処からか持ってきて、それを使ってビルドは無事に行われるようになりました。

2つめ。前のに付随するのですが、ビルド工程が簡単になったと同時に「自動化」も果たしました。自動化ということは人の手を必要としないということです。いつも機嫌の悪いサーバー管理の人にお伺いを立てたり、エクセルで作られたビルド申請書に、前回のビルドから変更したファイルの一覧を書いて申請しなくても結合テスト環境を最新にすることができます。最新に「する」だけではなく、最新に「保つ」こともできるようになりました。何せビルド工程は自動化されているのですから、1日に100万回ビルドを繰り返したとしても文句を言う人はいません。

3つめ。プロジェクト自体をライブラリとして、他のプロジェクトから依存させることができるようになりました。これが一番大きいです。

複数プロジェクト間の依存関係

依存解決ツールがその本領を発揮するのは、複数プロジェクト同士の依存関係を解決するときだと、私は思っています。

大規模開発だと、成果物としてのアプリケーションが一本ではない場合があります。複数のプロジェクト分割されて、その中には他のプロジェクトに機能を提供するだけの共通部品プロジェクトとか、個別のWebアプリケーションなんだけど、一部の機能が他からも呼ばれているとか、そんな組んずほぐれつな状態になります。

そしてプロジェクトが他のプロジェクトに依存した状態なので、一つのプロジェクトがビルド失敗すると連鎖して他のプロジェクトもビルド失敗します。また正しい順序でビルドしないと、全体のビルドが上手くいかなかったりします。

apache-Ivyは複数プロジェクトをまとめてビルドすることができます。複数のプロジェクトには依存関係がありますが、Ivyはそれらの依存関係を知っているので、適切な順番でビルドしてくれます。プロジェクトAをビルドして、出来上がったA.jarをクラスパスに入れてプロジェクトBをビルドして…といったことを自動でやってくれます。賢いですね!

Mavenとの違いは?

ライブラリの依存関係解決ツールといえばMavenが大御所です。Javaオープンソースのプロジェクトの殆どはMavenでビルドできるようになっている気がします。

Mavenっていう素晴らしいツールがあるのに、なんでapache-Ivyなんてものが出てきたのかというと、、、すみません。まだよくわかりません。今ところ感じるのは「融通が効く」っていうイメージです。例えば、Mavenだと公式のリポジトリで公開されていないライブラリを使いたいときは、他のリポジトリを探すか、自前でHTTPサーバー立ててやらないといけませんでした。Ivyはファイルシステムをリポジトリとして使うことができるので、ローカルにHTTPサーバー立てなくても共有フォルダでリポジトリが作れます。(Mavenでも出来るのかもしれないけど、私は知らないです。)

なんてこった

Apache-Ivyの使い方をまとめようと思ったのに、長い文章だけで時間が無くなってしまった。