我开发了一个库,其中一种方法具有以下形式:
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 文件,我会得到未定义的方法异常,因为脚本对象是从主应用程序传递的,并由 RootLoader 加载,而 MyBinding 由sun.misc.Launcher$AppClassLoader
它的子应用程序加载。有没有办法使用 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 -> Libraries 部分中的项目类路径中(我希望用户以这种方式或通过 maven 使用该库)。