【问题标题】:JAR plugins implementationJAR 插件实现
【发布时间】:2011-12-17 17:14:27
【问题描述】:

让我们有一个 Groovy/Java 应用程序,它应该使用一组类,定义在外部 *.jar-files 中(假设它们位于主可执行 jar 附近)。

因此,主类(让我们称之为Main)应该在运行时加载plugin.jar 文件并调用该jar 中定义的类上的一些实例方法(对于某些约定,假设类的名称为它的罐子——在我们的例子中是Plugin)。

Main 类在运行之前无法知道它有哪些插件。让我们扔掉 CLASSPATHjava -jar 运行参数,只用代码来发挥作用。

那么,如何做到这一点以及应该如何创建 plugin.jar(在我的情况下使用 Eclipse)以便正确加载?

PS: 是的,我确实将我的 groovy 源代码编译成 jar 文件。但我需要执行类加载并准确地即时调用。

【问题讨论】:

    标签: java reflection plugins groovy jar


    【解决方案1】:

    秘诀真的很简单!

    使用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!" });
    

    【讨论】:

      【解决方案2】:

      OSGi 框架支持插件的动态加载。有多种实现,包括支持 Eclipse 本身的 Equinox

      【讨论】:

      • 嗯,谢谢,但我希望我能在没有第三方的情况下做到这一点 =)
      猜你喜欢
      • 1970-01-01
      • 2015-08-01
      • 2020-11-15
      • 2015-03-06
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多