2012-10-19 30 views
0

我开发一个图书馆和它的方法有以下形式:有根装载器装载的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使用这个库)。

回答

1

取决于你如何运行脚本? 夫妇的方式,

  1. java命令的lib/yourLib.jar; LIB/groovy.jar org.codehaus.groovy.tools.GroovyStarter --classpath 的lib/yourBindingLib.jar; LIB /的.jar - 主groovy.ui.GroovyMain YourScript.groovy

  2. 你也可以把它在代码中使用之前指定的lib的URL,

    高清bindingLib =新文件(“...”);
    loader.addURL(bindingLib.toURI()。的toURL())

+0

我没有在从其中使用了罐的主要应用控制,我可以重新加载罐(或至少一组的类)事后?请再次显示 – Nutel

+0

如何运行程序/脚本。 – Arham

+0

我用一个例子更新了我的问题 – Nutel