【发布时间】:2011-08-25 14:33:34
【问题描述】:
Grape 似乎非常适合将 jars 添加到类路径中。它 还做了很多其他的事情,比如获取和依赖管理。 例如
#!/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()
有没有办法让葡萄从文件系统中抓取一个罐子?如果不, 我可以以某种方式复制葡萄在 groovy/java 中所做的事情吗?
我希望此解决方案适用于可由许多用户运行的脚本和许多不兼容的 jar,因此将 jar 添加到公共目录(如 ~/.groovy/lib/)将不起作用。
我可以为本地 jar 库创建一个本地 maven 存储库,但是 这似乎有点矫枉过正。
【问题讨论】: