用根加载器加载jar

时间:2012-10-19 00:26:16

标签: 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文件,我会得到未定义的方法异常,因为脚本对象是从主应用程序传递的,并且由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使用库)。

1 个答案:

答案 0 :(得分:1)

取决于你如何运行脚本? 几种方式,

  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

  2. 您还可以在将其用于代码

    之前指定lib的URL

    def bindingLib = new File(“...”);
    loader.addURL(bindingLib.toURI()。的toURL())