Java 使用根加载器加载jar
我开发了一个库,其中一个方法具有以下形式:Java 使用根加载器加载jar,java,binding,groovy,classloader,Java,Binding,Groovy,Classloader,我开发了一个库,其中一个方法具有以下形式: 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文
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加载器加载整个jar?出于某种原因,rootLoader.loadClass(“MyBinding”)
返回AppClassLoader加载的类,而不重新加载它
更新一个示例:
S.script(由用户创建):
Main.groovy(由用户创建):
用户添加到类路径的My 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中这样做,在Java构建路径->库部分,lib.jar被添加到项目的类路径中(我希望用户以这种方式或通过maven使用库)。取决于如何运行脚本? 两种方式
loader.addURL(bindingLib.toURI().toURL())
我无法控制使用jar的主应用程序,我可以在factum之后重新加载jar(或至少一组类)吗?
class Main {
static void main(String[] args) {
Lib.setVars(S)
}
}
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())
}
}