用 Java 构建插件系统的最佳方法

如何为 Java 应用程序实现一个插件系统?

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

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

使用 OSGi

它是 Eclipse 插件系统的基础。春分是 Eclipse 的实现(许可的 EPL) ,费里斯是 Apache 项目的实现(许可的 Apache 公共许可证)。

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

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

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

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

当然,您也可能希望实现某种类型的沙箱,以便限制插件能够做什么和不能做什么。我已经创建了一个小的 测试申请(和 在博客上写的) ,它由两个插件组成,其中一个插件被拒绝访问本地资源。

从1.6开始,如果你想编写自己的简单系统,就可以使用 服务加载程序

但是,如果您想要的不仅仅是基本特性,那么可以使用现有的框架之一。

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

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

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

我在构建这个项目时心里有几个目标:

  • 无论你是构建一个 web 应用程序还是一个桌面应用程序,你都应该以相同的方式启动这个应用程序,一个普通的 main 方法,没有花哨的 web.xml 声明(并不是说我反对使用标准的 web 描述符,但是它不适合一个插件系统,你可以添加“ servlets”——我称之为 RequestHandler (s)——随你的意愿动态)。
  • 很容易在“扩展点”周围插入“扩展”——这是来自 Eclipse 的一些东西,但是是一种不同的方法。
  • 自部署,因为所有的插件都是注册的(XML 文件) ,所以应用程序必须是独立于构建系统的自部署-当然有一个 Ant 任务和一个 Maven MOJO,它们是与我们的世界的链接,但是最终它调用应用程序并指示它在一个特定的位置自部署自己。
  • 它可以从存储库(包括 Maven 1和2存储库)下载代码,所以只要你能访问存储库,你的应用程序就可以作为一个单独的小罐子部署(有时很有用,基本上这提供了自动更新的支持-难道你不喜欢你的 web 应用程序通知你有一个更新的版本,它已经下载了,它只需要你的许可就可以安装吗?我知道我喜欢那样)。
  • 基本的应用程序监控系统健康状况,发生故障时发送电子邮件通知

我在 OSGi 上工作了一个星期——一个紧张的,只有 OSGi 的星期。最后,这就像一个噩梦,但我学到了很多。

我能够让 OSGi 工作(不容易,所有的例子都过时了,网上的所有东西如果不是五年的话,至少也有三年了) ,但是由于 jar 清单的问题,我很难把它集成到一个现有的项目中。

简而言之,只有一些模糊的工具用于构建清单,并且它们没有很好的文档(BND Tools 几乎不模糊,但它是为 Eclipse 中的某个过程设计的)。此外,大多数可用的 OSGi 信息并不针对拥有现有桌面应用程序的应用程序开发人员。

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

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