Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用根加载器加载jar_Java_Binding_Groovy_Classloader - Fatal编程技术网

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使用库)。

取决于如何运行脚本? 两种方式

  • java-cp-lib/yourLib.jar;lib/groovy.jar org.codehaus.groovy.tools.GroovyStarter——类路径 lib/yourBindingLib.jar;lib/.jar——主groovy.ui.GroovyMain YourScript.groovy

  • 在代码中使用库之前,还可以指定库的URL

    def bindingLib=新文件(“…”)
    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()) 
      }
    }