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


Answers:


107

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

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

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

当然,您可能还想实现某种沙箱操作,以使该插件在它可以做什么和不能做什么方面受到限制。我创建了一个小型测试应用程序(并通过博客发布了),该应用程序由两个插件组成,其中一个被拒绝访问本地资源。


2
您提到的沙箱实际上是最困难的部分!但不要烦恼-osgi已经如上所述为您做到了。
CHII

1
沙盒并不难。花了我大约两个星期的时间,找出正确的方法,但是一旦您知道这很简单。:)
孟买

@Bombe这个示例应用程序仍然可以在任何地方吗?
ataulm 2012年


@ timberwo7ves我不明白你的意思。仍然可以从文章中指定的位置以及您提到的页面下载文件测试应用程序。
孟买2012年

41

使用OSGi

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

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


4
我涉猎OSGi,但从未找到真正好的入门书。如果有人可以在这里推荐一些链接,那就太好了。
布赖恩·马修斯

1
我已经将春分嵌入到我的应用程序中,并使用标准的OSGi实践来完成OP想要的操作。也在摇摆,不是SWT。网络启动也是如此。良好的开始资源:neilbartlett.name/blog
basszero

3
理想情况下,OSGi是事实上的插件系统。但是,从标准Ja​​va到OSGi编程模型的飞跃非常广泛……
Hendy Irawan 2010年


16

这里有人使用过JPF吗?听起来很有趣
Sven Lilienthal

1
JabRef的插件使用JPF。效果很好。
koppor

我正在使用JPF,但它与Ant紧密结合。我想摆脱它,但我不知道它将对我的应用程序产生多大影响。
MartinL 2013年

我为开源产品(OpenEMM)创建了一个JPF插件;我能够用maven(maven-assembly plugin)做到这一点;可以肯定的是,即使现在它很受OSGI的欢迎,我也非常欣赏开发的简便性。
рüффп

使用JPF的Java版本是否有限制?
Madhav

16

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


我发现这正是我所需要的,而且看起来很简单,但我需要一些帮助
nonybrighto

尝试在github上向Decebal提出问题。他会帮你
丹尼尔JIPA

请参阅meta.stackoverflow.com/questions/376686/…关于Decebals帐户的状态
Wolfgang Fahl,

1
如果您正在查看pf4j,则还可以查看github.com/hank-cp/sbp。它构建在pf4j之上,以支持Spring Boot构建完整的Web应用程序。
汉克,

13

我在OSGi上工作了一个星期-辛苦了一个星期,除了OSGi。最后,这就像一个噩梦,但我学到了很多东西。

我能够使OSGi正常工作(不容易,所有示例都已过时,网络上的所有内容至少都存在三年以上(如果不是五年的话)),但是由于存在问题,将其集成到现有项目中时遇到了很大的麻烦。罐子清单。

简而言之,只有少数晦涩难懂的工具可用于构建清单,并且它们的文档也没有得到很好的记录(BND Tools很少晦涩难懂,但它是为Eclipse中的特定过程而设计的)。同样,大多数可用的OSGi信息也不针对具有现有桌面应用程序的应用程序开发人员。

这使得大量信息模糊或不适当的上下文。尼尔·巴特利特(Neil Bartlett)的博客文章是最大的帮助,但即使是那些未能获得正常工作的系统,我也从Felix教程中获取了一些代码,并将它们拼凑在一起以使嵌入式框架得以运转。我发现他几年前免费发布的书稿非常好,但是由于Eclipse OSGi支持的变化,Eclipse中的示例不起作用。

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


17
这个答案如何?关于OSGi的更多信息,甚至没有解释OSGi是什么。
Stealth Rabbi 2015年

@StealthRabbi在此“答案”发布之时,以及之后的一段时间,对于那些试图在野外与OSGi一起工作的人来说,这是一个很好的信息。OSGi已经成为讨论的一部分-因此无需定义它。这是一个答案,因为它可能为人们节省了一周的工作时间-这样做的全部原因。
肖恩·安德森

9

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


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部署),并且基本上可以为自动更新-您是否不喜欢通过Web应用程序通知它有较新版本,已下载并且仅需要您的许可才能安装的想法?我知道我很喜欢。
  • 有关系统运行状况的基本应用程序监视,发生故障时的电子邮件通知

2
我不是要na,但是自那以后您是否一直在努力?该代码是否可用(我可能可以原样使用或添加它)?
Piccolo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.