让我们有一个 Groovy/Java 应用程序,它应该使用一组在外部 *.jar
文件中定义的类(假设它们位于主要可执行 jar 附近)。
因此,主类(让我们称它为 Main
)应该在运行时加载 plugin.jar
文件并调用该类中定义的一些实例方法,在该 jar 中定义(对于某些约定,假设该类的名称作为其 jar - Plugin
在我们的例子中)。
Main
类在运行之前无法知道它拥有哪些插件。让我们扔掉 CLASSPATH
和 java -jar
运行参数,只用代码来施展魔法。
那么,如何做到这一点以及如何创建 plugin.jar
(在我的例子中使用 Eclipse)以便正确加载?
PS: 是的,我确实将我的 groovy 源代码编译成 jar 文件。但我需要执行类加载并即时调用。
最佳答案
secret 真的很简单!
使用 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!" });
关于java - JAR 插件实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8546467/