2011-12-17 51 views
3

讓我們有一個應該使用外部*.jar文件中定義的一組類的Groovy/Java應用程序(假設它們位於主可執行jar附近)。因此,主類(我們稱之爲Main)應該在運行時加載plugin.jar文件,並在該jar中定義的類上調用某個實例方法(對於某些約定,假設該類的名稱爲jar - 在我們的案例中爲Plugin)。JAR插件實現

Main類在運行前無法知道它擁有哪些插件。讓我們扔掉CLASSPATHjava -jar運行參數,只用代碼來實現魔術。

那麼,如何做到這一點,以及如何創建plugin.jar(在我的情況下使用Eclipse)才能正確加載?

PS:是的,我編譯我的groovy源文件到jar文件。但是我需要執行類加載並在運行中精確調用。

回答

2

祕密非常簡單!

使用URLClassLoader會訣竅。

所以,的Groovy代碼:

ClassLoader loader = new URLClassLoader((URL[]) [ 
    new File("C:\\Users\\errorist\\workspace\\javatest1\\bin\\").toURI().toURL() 
]) 

Class c = loader.loadClass("src.SomeClass1") 

c.invokeMethod("main", (String[]) ["Hello", "World"]) 

而且的Java之一:

File file = new File("C:\\Users\\errorist\\workspace\\javatest1\\bin\\"); 
URL[] urls = new URL[] { file.toURI().toURL() }; 
ClassLoader loader = new URLClassLoader(urls); 
Class c = loader.loadClass("src.SomeClass1"); 
c.invokeMethod("main", new String[] { "Hello", "World!" }); 
1

OSGi框架支持插件的動態加載。有多種實現,其中包括Equinox,它支持Eclipse本身。

+0

好,謝謝,但我想,如果我能做到這一點沒有第三方=) – shybovycha 2011-12-17 17:38:15