我开发了一个库,其中一个方法有以下形式:
void setVars(def script) {
// script parameter is an instance of groovy.lang.Script loaded by Rootoader
// MyBinding is part of the lib and extends groovy.lang.Binding
script.setBinding(new MyBinding())
}
现在,如果库被用作jar文件,我会得到未定义的方法异常,因为脚本对象是从主应用程序传递的,并且由sun.misc.Launcher$AppClassLoader
加载MyBinding时由RootLoader加载,这是它的儿童。有没有办法使用RootClass Loader加载整个jar?出于某种原因,rootLoader.loadClass("MyBinding")
返回由AppClassLoader加载的类,并且不会重新加载它。
更新一个例子:
S.script(由用户创建):
println 1
Main.groovy(由用户创建):
class Main {
static void main(String[] args) {
Lib.setVars(S)
}
}
我的lib.jar由用户添加到类路径中:
class MyBinding extends Binding {
//...
}
class Lib {
static void setVars(Class scriptClass) {
def script = scriptClass.newInstance()
//Exception as MyBinding is loaded by MyBinding
//while script class is loaded by RootLoaded
script.setBinding(new MyBinding())
}
}
Main.groovy是运行的文件。我是从eclipse开始的,其中lib.jar被添加到Java Build Path中的项目类路径中 - >库部分(我希望用户以这种方式或通过maven使用库)。
答案 0 :(得分:1)
取决于你如何运行脚本? 几种方式,
java -cp lib / yourLib.jar; lib / groovy.jar org.codehaus.groovy.tools.GroovyStarter --classpath lib / yourBindingLib.jar; lib / .jar --main groovy.ui.GroovyMain YourScript.groovy
您还可以在将其用于代码
之前指定lib的URL def bindingLib = new File(“...”);
loader.addURL(bindingLib.toURI()。的toURL())