我开发一个图书馆和它的方法有以下形式:有根装载器装载的jar
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加载的类,并且不会重新加载它。
UPDATE用一个例子:
S.script(由用户创建的):
println 1
Main.groovy(由用户创建的):
class Main {
static void main(String[] args) {
Lib.setVars(S)
}
}
我的库。用户添加到类路径中的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使用这个库)。
我没有在从其中使用了罐的主要应用控制,我可以重新加载罐(或至少一组的类)事后?请再次显示 – Nutel
如何运行程序/脚本。 – Arham
我用一个例子更新了我的问题 – Nutel