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


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

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

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

129
2018-01-21 12:33


起源




答案:


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

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

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

当然,您可能还希望实现某种沙盒,以便插件受限于它能够做什么和不能做什么。我创造了一个小的 测试应用 (和 关于它的博客)由两个插件组成,其中一个插件被拒绝访问本地资源。


92
2018-01-21 12:45



你提到的沙箱实际上是最困难的部分!但不要担心 - 如上所述,osgi已经为你做了。 - Chii
沙盒并不难。花了我两个星期的时间才知道如何正确地做到这一点但是一旦你知道这很简单。 :) - Bombe
那么,给我们一些线索:-) - Sven Lilienthal
pterodactylus.net/download/security-test.tar.bz2 - Bombe
@Bombe是这个示例应用程序仍然住在任何地方? - ataulm


使用 OSGi的

它是Eclipse插件系统的基础。 春分 是Eclipse的实现(许可的EPL)和 费利克斯 是Apache Project的实现(许可的Apache公共许可证)。

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


41
2018-01-21 12:44



我已经涉足过OSGi,但从来没有找到一个非常好的入门书。如果有人可以在这里推荐一些链接会很棒。 - Brian Matthews
我已将equinox嵌入到我的应用程序中,并使用标准OSGi实践来完成OP所需的操作。在摇摆中,不是SWT。 Web也是开始的。良好的起始资源: neilbartlett.name/blog - basszero
OSGi理想情况下是事实上的插件系统。但是,从标准Ja​​va到OSGi编程模型的飞跃相当广泛...... - Hendy Irawan


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

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


28
2018-01-21 14:34





还有 JPF(Java插件框架)


16
2018-01-21 14:26



有没有人在这里使用JPF?听起来不错 - Sven Lilienthal
JabRef使用JPF作为其插件。效果很好。 - koppor
我正在使用JPF,但它与Ant紧密结合。我想摆脱它,但我不知道它会对我的应用程序产生多大的影响。 - MartinL
我为开源产品(OpenEMM)创建了一个JPF插件;我能够用maven(maven-assembly插件)制作它;当然,我非常欣赏开发的简单性,即使现在它可能更受欢迎的OSGI。 - рüффп
使用JPF的java版本有什么限制吗? - Madhav


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

我能够让OSGi工作(不容易,所有的例子都已经过时了,网上的一切都至少有三年,如果不是五年),但由于问题导致我将其集成到现有项目中,我遇到了很大的麻烦。罐子清单。

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

这使得信息的大量背景模糊或不合适。 Neil Bartlett的博客文章是最大的帮助,但即使是那些未能获得工作系统的人(我从Felix教程中抓取了一些代码并拼凑起来以使嵌入式框架滚动)。我找到了他多年前免费发布的书籍草稿,非常好,但是由于Eclipse OSGi支持的变化,Eclipse中的示例不起作用。

每一步都是一个主要障碍。我稍后会尝试在此处发布更多详细信息。


13
2017-12-10 19:34



这是一个怎样的答案?这更像是对OSGi的咆哮,你甚至都没有解释OSGi是什么。 - Stealth Rabbi


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


9
2018-01-29 18:24





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


9
2017-11-24 14:12



我发现这是我需要的,它似乎很简单,但我需要一些帮助 - nonybrighto
试着在github上向Decebal提问。他会帮助你的 - Daniel Jipa


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

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

我在脑海中建立了一些目标:

  • 如果您构建一个Web应用程序或桌面应用程序,您应该以相同的方式启动应用程序无关紧要,一个简单的主要方法,没有花哨的web.xml声明(不是我反对有一个标准的Web描述符,但是插件系统不合适,你可以在其中添加“servlets” - 我称之为RequestHandler(s) - 随意动态)。
  • 容易插入“扩展点”周围的“扩展” - 来自Eclipse的东西,但不同的方法。
  • 可自行部署,因为所有插件都已注册(XML文件),应用程序必须可独立于构建系统自行部署 - 当然,有一个Ant任务和一个Maven MOJO,它们是与我们世界的链接,但在结束它调用应用程序并指示它在特定位置自我部署。
  • 从Maven借来的,它可以从存储库(包括Maven 1和2存储库)下载代码,这样只要您有权访问存储库,您的应用程序就可以部署为一个小jar(有时可用,基本上这可以支持自动存储 - 更新 - 你不喜欢你的网络应用程序通知有更新的版本,它被下载,它只需要你的许可安装它的想法吗?我知道我喜欢这个)。
  • 关于系统运行状况的基本应用程序监控,发生故障时的电子邮

3
2017-10-23 14:03



我不是故意唠叨,但你从那以后就开始研究了吗?代码是否可用(我可以按原样使用它或添加它)? - Piccolo