Grape は、クラスパスに jar を追加するのにかなりうまく機能しているようです。また、フェッチや依存関係管理など、他にも多くのことを行います。例えば
#!/home/robert/bin/groovy
import org.apache.commons.lang.StringUtils
@Grab(group='commons-lang', module='commons-lang', version='2.4')
def strings = ['Hello', 'Groovy', 'AVeryLongWord!', 'A simple sentence']
strings.each { String aString ->
println "$aString: ${StringUtils.abbreviate(aString,10)}"
}
残念ながら、ファイルシステムに動的に追加したい jar がファイルシステムにある場合は、はるかに醜いソリューションに頼る必要があります。
#!/home/robert/bin/groovy
def loader = this.class.classLoader.rootLoader
loader.addURL(new File("/home/robert/somejars/arithmetic-1.1.jar").toURI().toURL())
// can't use traditional package import
arithmeticMainClass = Class.forName("org.scharp.arithmetic.Main")
println "42 - 23 = " + arithmeticMainClass.subtract(42, 23)
// can't use "new" operator
myArithmeticObject = arithmeticMainClass.newInstance()
グレープにファイルシステムから jar を取得させる方法はありますか? そうでない場合、groovy/Java でグレープが行っていることをどうにかして複製できますか?
多くのユーザーが実行できるスクリプトや互換性のない多くの jar に対してこのソリューションが機能するようにしたいので、~/.groovy/lib/ などの共通ディレクトリに jar を追加しても機能しません。
ローカルのjarライブラリ用にローカルのmavenリポジトリを作成できましたが、それはやり過ぎのようです。