0

我开发了一个库,其中一种方法具有以下形式:

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

4

1 回答 1

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. 您还可以在将其用于代码之前指定库的 URL,

    def bindingLib = new File("...");
    loader.addURL(bindingLib.toURI().toURL())

于 2012-10-19T00:54:19.923 回答