GroovyのGrapeを使うと実行時に依存関係を解決できます。
Grapeの内部にはIvyが使われていますので、 日記/2012/09/30/Apache IvyとローカルのMavenリポジトリの連携 で実験したIvyの設定などがそのまま活用できます。
Mavenローカルリポジトリとの連携もIvyの話がそのまま適用され、codehausのGrapeのページにも"~/.groovy/grapeConfig.xml"にMavenローカルリポジトリ参照用の<ibiblio>resolverの組み込み方が紹介されています。
・・・が、2.0系では以下のchangesetで上記設定が組み込み済みになっています。
1.8.0の段階ではまだ組み込まれてなかったようです:
しかし、1.8系の新し目であれば上記2.0系への変更がバックポートされています。
groovy-1.8.8.jarから取り出して見ると、確かに"${user.home}/.m2/repository/"が組み込み済みでした。
$ jar xf groovy-1.8.8.jar groovy/grape/defaultGrapeConfig.xml $ cat groovy/grape/defaultGrapeConfig.xml ... <ibiblio name="localm2" root="file:${user.home}/.m2/repository/" \ checkmodified="true" changingPattern=".*" changingMatcher="regexp" m2compatible="true"/> ...
上記のように、1.8系の最新 or 2.0系以降であればデフォルトでMavenのローカルリポジトリを参照してくれるようになっていました。
ということで実験ですが、今回は 日記/2012/09/30/Apache IvyとローカルのMavenリポジトリの連携 でローカルにinstallしたjarをGrapeで呼び出してみます。
foo.groovy:
@Grab(group='mvntest', module='mvnjartest', version='1.0-SNAPSHOT') import mvnjartest.App def a = new App('hello world') println(a.capitalize())
$ groovy foo.groovy Hello World
これにより、"~/.groovy/grapes/" 以下にcommons-langとmvnjartestのjarが展開されました。
~/.groovy/grapes/ commons-lang/ commons-lang/ ivy-2.1.xml ivy-2.1.xml.original ivydata-2.1.properties jars/ commons-lang-2.1.jar mvntest/ mvnjartest/ ivy-1.0-SNAPSHOT.xml ivy-1.0-SNAPSHOT.xml.original ivydata-1.0-SNAPSHOT.properties jars/ mvnjartest-1.0-SNAPSHOT.jar
ということで特にオチはありません。
もしNexusなど会社とかチーム独自のローカルリポジトリサーバを運営している場合は、"~/.groovy/grapeConfig.xml"のカスタマイズで対処できると思われます。
最初は".m2/repository"を共有できないかな~と思ったんですが、Grapeは内部的にはIvyを使ってるので難しいかもしれません。Grapeには"grape"コマンドが付属してまして、
grape list grape install grape uninstall
などが使えます。また上記のようにディレクトリ構成もivyになってるので、MavenのローカルリポジトリをそのままGrape(=Ivy)のキャッシュとして使いまわす、というのは難しいようです。
Mavenの場合はリポジトリとキャッシュが同じ".m2/repository/"を共有する方式ですが、IvyやGrapeはリポジトリとキャッシュを区別して、ローカルに保存するのはキャッシュ、という具合に割り切っているようです。
jarファイルが重複してしまいますが、利便性とのトレードオフで諦めるしか無いのか・・・(´・ω・`)