153

您将如何为您的 Java 应用程序实现插件系统?

是否有可能拥有一个易于使用(对于开发人员)的系统,它可以实现以下目标:

  • 用户将他们的插件放入应用程序的子目录中
  • 该插件可以提供一个配置屏幕
  • 如果使用框架,许可证是否与商业开发兼容?
4

8 回答 8

111

首先,您需要一个所有插件都需要实现的接口,例如

public interface Plugin {
    public void load(PluginConfiguration pluginConfiguration);
    public void run();
    public void unload();
    public JComponent getConfigurationPage();
}

然后插件作者应该将他们的插件捆绑到 JAR 文件中。您的应用程序打开 JAR 文件,然后可以使用 JAR 清单中的属性或 JAR 文件中所有文件的列表来查找实现插件接口的类。实例化那个类,插件就可以使用了。

当然,您可能还想实现某种沙盒,以便插件限制它可以做什么和不能做什么。我创建了一个包含两个插件的小型测试应用程序(并写了一篇博客),其中一个插件被拒绝访问本地资源。

于 2009-01-21T12:45:48.980 回答
43

使用OSGi

它是 Eclipse 插件系统的基础。Equinox是 Eclipse 的实现(获得许可的 EPL),Felix是 Apache 项目的实现(获得许可的 Apache Public License)。

Eclipse 提供了一个具体示例,OSGi 可以涵盖您提到的要点(或者,如果您想要一个完整的 Eclipse/SWT/JFace 堆栈,您可以在Eclipse RCP之上构建您的应用程序)。

于 2009-01-21T12:44:35.673 回答
30

从 1.6 开始,如果您想编写自己的简单系统,可以使用java.util.ServiceLoader 。

但是,如果您想要的不仅仅是基本功能,请使用现有框架之一。

于 2009-01-21T14:34:20.070 回答
20

使用PF4J。它支持 Web、Spring 和 Wicket。易于使用和构建应用程序

于 2014-11-24T14:12:57.583 回答
16

还有JPF(Java 插件框架)

于 2009-01-21T14:26:01.977 回答
15

我在 OSGi 上工作了一周——这是一个紧张的,除了 OSGi 的一周。最后,这就像一场噩梦,但我学到了很多。

我能够让 OSGi 正常工作(不容易,所有示例都已过时,网络上的所有内容都至少有 3 年历史,如果不是 5 年的话),但由于存在问题,我很难将它集成到现有项目中jar 体现。

简而言之,用于构建清单的工具很少,并且没有很好的文档记录(BND 工具并不晦涩,但它是为 Eclipse 中的某个进程设计的)。此外,大多数可用的 OSGi 信息并不针对拥有现有桌面应用程序的应用程序开发人员。

这使得信息的很多上下文模糊或不恰当。Neil Bartlett 的博客文章是最大的帮助,但即使是那些也未能获得一个工作系统(我从 Felix 教程中获取了一些代码并将它们拼凑在一起以使嵌入式框架滚动)。我找到了他多年前免费发布的书稿,非常好,但是由于 Eclipse OSGi 支持的变化,Eclipse 中的示例无法正常工作。

于 2012-12-10T19:34:44.770 回答
10

我认为推荐 OSGi 来解决上述问题是非常糟糕的建议。OSGi 是“正确的选择”,但对于上述场景,我认为 JPF 或一些本土的简约框架就足够了。

于 2009-01-29T18:24:59.867 回答
3

几年前,我开始了一个这样的项目,我希望很快就能准备好。我受到了 NetBeans 和 Eclipse 等项目的启发,但与此同时,它变得有点不同。OSGi 现在看起来是一个不错的选择,但我没有机会将它与我的项目进行比较。它与上面提到的 JPF 相似,但同时在很多方面有所不同。

激励我的基本想法是尽可能简单地构建 Java 应用程序,不将 Web 应用程序、桌面应用程序或 applet/JWS 应用程序(当然这还不包括 UI)作为核心功能分开。

我建立这个项目时有几个目标:

  • 无论您构建 Web 应用程序还是桌面应用程序,都应该以相同的方式启动应用程序,一个普通的 main 方法,没有花哨的 web.xml 声明(不是我反对使用标准的 Web 描述符,而是它不适用于插件系统,您可以在其中添加“servlet” - 我称它们为 RequestHandler(s) - 随意动态)。
  • 易于围绕“扩展点”插入“扩展”——来自 Eclipse,但方法不同。
  • 可自我部署,因为所有插件都已注册(XML 文件),所以应用程序必须能够独立于构建系统进行自我部署——当然还有 Ant 任务和 Maven MOJO,它们是与我们的世界的链接,但在最后它调用应用程序并指示它在特定位置自我部署。
  • 从 Maven 借来的,它可以从存储库(包括 Maven 1 和 2 存储库)下载代码,因此只要您可以访问存储库,您的应用程序就可以部署为单个小 jar(有时很有用,基本上这提供了对 auto-更新 - 你不喜欢你的网络应用程序通知你有一个更新的版本,它已经下载并且只需要你的许可来安装它吗?我知道我喜欢那个)。
  • 有关系统运行状况的基本应用程序监控,发生故障时的电子邮件通知
于 2009-10-23T14:03:41.743 回答