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

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

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

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

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

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

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

当然,你也可能想要实现某种沙盒,以便插件被限制在它可以或不可以做的地方。 我创build了一个包含两个插件的小型testing应用程序 (并对此进行了博客 ),其中一个插件被拒绝访问本地资源。

使用OSGi 。

它是Eclipse插件系统的基础。 Equinox是Eclipse的实现(授权的EPL), Felix是Apache Project的实现(许可的Apache Public License)。

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

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

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

还有JPF(Java插件框架) 。

我在OSGi工作了一个星期 – 一个激烈的,只有OSGi周。 最后,这是一个糟糕的梦,但我学到了很多东西。

我能够得到OSGi的工作(不容易,所有的例子都过时了,如果不是五年,networking上的所有东西都至less要三年),但是我很难将它整合到现有的项目中, jar清单。

简而言之,只有less量用于构build清单的晦涩工具,而且它们没有很好的文档logging(BND工具很难掩盖,但它是为Eclipse中的某个过程devise的)。 此外,大多数可用的OSGi信息不针对拥有现有桌面应用程序的应用程序开发人员。

这使信息的上下文变得模糊或不合适。 Neil Bartlett的博客文章是最大的帮助,但即使是那些没有得到一个工作系统(我从Felix教程抓住了一些代码,并拼凑在一起,以获得embedded式框架滚动)。 我发现他几年前免费发布的书籍草稿,非常好,但Eclipse中的示例因为Eclipse OSGi支持的变化而不起作用。

每一步都是一个主要的障碍。 稍后我会试着在这里发表更多的细节。

我认为build议OSGi解决上述问题是非常糟糕的build议。 OSGi是“正确的select”,但是对于上面的场景,我认为JPF或者一些自制的简约框架就足够了。

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

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

激发我的基本思想是尽可能简单地构buildJava应用程序,而不需要将Web应用程序,桌面应用程序或Applet / JWS应用程序(当然这还不包括UI)分离为核心function。

我在脑海中build立了几个目标的项目:

  • 不要紧,如果你build立一个Web应用程序或桌面应用程序,你应该以相同的方式启动应用程序,一个简单的主要方法,没有花哨的web.xml声明(不是我反对有一个标准的Web描述符,但它不适合于插件系统,在那里添加“servlets” – 我把它们称为RequestHandler(dynamic)。
  • 容易插入一个“扩展点”周围的“扩展” – 从Eclipse的东西,但一个不同的方法。
  • 自我部署,因为所有的插件都是注册的(XML文件),应用程序必须独立于构build系统才能自行部署 – 当然还有一个Ant任务和一个Maven MOJO,这些是与世界各地的链接,但是在结束它调用的应用程序,并指示它自我部署在一个特定的位置。
  • 从Maven借用,它可以从仓库(包括Maven 1和2仓库)下载代码,所以只要你有权访问仓库,你的应用程序就可以作为一个小的jar被部署(有用的时候,基本上这提供了对自动 – 更新 – 你不喜欢这个想法,通知你的Web应用程序有一个更新的版本,它被下载,它只需要你的许可来安装它?我知道我喜欢这个)。
  • 有关系统健康的基本应用程序监控,出现故障时的电子邮件通知