2011-12-17 56 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