40

我想创建一个可以用插件扩展的 Java 程序。我该怎么做,我应该在哪里寻找?

我有一组插件必须实现的接口,它应该在一个 jar 中。该程序应该在相对(程序)文件夹中监视新的 jar,并以某种方式注册它们。


虽然我确实喜欢 Eclipse RCP,但我认为它对于我的简单需求来说太过分了。

Spring也是如此,但既然我还是要看它,我不妨试试看。

但是,我仍然希望找到一种方法来尽可能简单地创建我自己的插件“框架”。

4

6 回答 6

48

我已经为我过去编写的软件做过这个,它非常方便。我首先创建了一个我所有的“插件”类都需要实现的接口。然后我使用 Java ClassLoader加载这些类并创建它们的实例。

您可以这样做的一种方法是:

File dir = new File("put path to classes you want to load here");
URL loadPath = dir.toURI().toURL();
URL[] classUrl = new URL[]{loadPath};

ClassLoader cl = new URLClassLoader(classUrl);

Class loadedClass = cl.loadClass("classname"); // must be in package.class name format

这已经加载了类,现在你需要创建它的一个实例,假设接口名称是 MyModule:

MyModule modInstance = (MyModule)loadedClass.newInstance();
于 2008-08-25T00:21:40.637 回答
18

查看OSGi

一方面,OSGi 为管理、启动和使用模块化软件组件做许多其他事情提供了各种基础设施。另一方面,它可能对您的需求来说太重了。

顺便说一句,Eclipse 使用 OSGi 来管理它的插件。

于 2008-08-25T14:09:53.860 回答
15

我建议您仔细查看Java Service Provider (SPI) API。它提供了一个简单的系统,用于查找类路径上所有 Jars 中的所有类,这些类将自身暴露为实现特定服务。我过去曾将它与插件系统一起使用,并取得了巨大的成功。

于 2008-08-25T03:05:00.260 回答
6

虽然我会支持接受的解决方案,但如果需要基本的插件支持(大多数时候都是这种情况),还有Java 插件框架(JPF),虽然缺乏适当的文档,但它是一个非常简洁的插件框架执行。

它很容易部署并且 - 当你通过类加载特性时 - 非常容易开发。上面的注释是要注意插件目录下的插件加载路径必须以完整的类路径命名,除了将其类文件部署在名为 path 的普通包路径中。例如

plugins
`-com.my.package.plugins
  `-com
    `-my
      `-package
        `-plugins
          |- Class1.class
          `- Class2.class
于 2008-12-20T21:47:15.160 回答
4

在本土的类加载器方法中:虽然它绝对是了解类加载器的好方法,但有一种叫做“类加载器地狱”的东西,当涉及到在更大的项目中使用时,大多数人都知道它。冲突的类很容易引入但很难解决。

Eclipse 几年前转向 OSGi 是有充分理由的。所以,如果它不仅仅是一个宠物项目,那么认真研究一下 OSGi。它值得一看。您将了解类加载器以及新兴的技术标准。

于 2008-09-30T10:04:34.050 回答
1

您是否考虑过在 Eclipse 的富客户端平台之上构建,然后公开 Eclipse 扩展框架?

此外,根据您的需要,Spring 框架可能会帮助您解决此问题以及您可能想做的其他事情: http ://www.springframework.org/

于 2008-08-24T23:38:08.480 回答