2012-10-19 71 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