使用 Java 构建插件系统的最佳方法
Posted
技术标签:
【中文标题】使用 Java 构建插件系统的最佳方法【英文标题】:Best way to build a Plugin system with Java 【发布时间】:2010-10-02 16:20:13 【问题描述】:您将如何为您的 Java 应用程序实现插件系统?
是否有可能拥有一个易于使用(对于开发人员)的系统,它可以实现以下目标:
用户将他们的插件放到应用程序的子目录中 插件可以提供配置屏幕 如果您使用框架,许可证是否与商业开发兼容?【问题讨论】:
【参考方案1】:我在 OSGi 上工作了一周——这是一个紧张的、不过是 OSGi 的一周。最后,这就像一场噩梦,但我学到了很多。
我能够让 OSGi 工作(不容易,所有示例都已过时,网络上的所有内容如果不是 5 年,至少也有 3 年的历史),但我很难将它集成到现有项目中,因为jar 清单的问题。
简而言之,用于构建清单的工具很少,并且没有很好的文档记录(BND 工具几乎不晦涩,但它是为 Eclipse 中的某个进程设计的)。此外,大多数可用的 OSGi 信息并不针对拥有现有桌面应用程序的应用程序开发人员。
这使得信息的很多上下文模糊或不恰当。 Neil Bartlett 的博客文章是最大的帮助,但即使是那些也未能获得一个工作系统(我从 Felix 教程中获取了一些代码并将它们拼凑在一起以使嵌入式框架滚动)。我找到了他多年前免费发布的书稿,非常好,但是由于 Eclipse OSGi 支持的变化,Eclipse 中的示例无法正常工作。
【讨论】:
答案如何?这更像是对 OSGi 的咆哮,你甚至没有解释 OSGi 是什么。 @StealthRabbi 在给出这个“答案”的时候以及之后的一段时间,对于那些试图在野外使用 OSGi 的人来说,这是一个很好的信息。 OSGi 已经是讨论的一部分——所以没有必要定义它。这是一个答案,因为它可能为人们节省了一周的工作时间——这就是 SO 的全部原因。【参考方案2】:使用PF4J。 它支持 Web、Spring 和 Wicket。 易于使用和构建应用程序
【讨论】:
我发现这是我需要的,它似乎很简单,但我需要一些帮助 尝试在 github 上向 Decebal 提出问题。他会帮助你 在此处查看 meta.***.com/questions/376686/… 了解 Decebals 帐户状态 如果你在看 pf4j,你也可以看看github.com/hank-cp/sbp。它建立在 pf4j 之上,支持 Spring Boot 构建完整的 Web 应用程序。【参考方案3】:使用OSGi。
它是Eclipse插件系统的基础。 Equinox 是 Eclipse 的实现(获得许可的 EPL),Felix 是 Apache 项目的实现(获得许可的 Apache Public License)。
Eclipse 提供了一个具体示例,OSGi 可以涵盖您提到的要点(或者,如果您想要完整的 Eclipse/SWT/JFace 堆栈,您可以在 Eclipse RCP 之上构建您的应用程序)。
【讨论】:
我曾涉足过 OSGi,但从未找到真正好的入门读物。如果有人可以在这里推荐一些链接,那就太好了。 我已将 Equinox 嵌入到我的应用程序中,并使用标准的 OSGi 实践来完全满足 OP 的要求。也在摇摆不定,不是 SWT。网络也开始了。好的起始资源:neilbartlett.name/blog OSGi 是理想的事实上的插件系统。然而,从标准 Java 到 OSGi 编程模型的飞跃是相当广泛的......【参考方案4】:还有JPF (Java Plugin Framework)。
【讨论】:
这里有人用过JPF吗?听起来很有趣 JabRef 将 JPF 用于其插件。效果很好。 我正在使用 JPF,但它与 Ant 紧密耦合。我想摆脱它,但我不知道它会对我的应用程序产生多大影响。 我为一个开源产品(OpenEMM)创建了一个JPF插件;我能够使用 maven(maven-assembly 插件)来制作它;当然,我真的很欣赏开发的简单性,即使现在它可能是更流行的 OSGI。 使用JPF的java版本有限制吗?【参考方案5】:首先你需要一个所有插件都需要实现的接口,例如
public interface Plugin
public void load(PluginConfiguration pluginConfiguration);
public void run();
public void unload();
public JComponent getConfigurationPage();
插件作者应该将他们的插件捆绑到 JAR 文件中。您的应用程序打开 JAR 文件,然后可以使用 JAR 清单中的属性或 JAR 文件中所有文件的列表来查找实现插件接口的类。实例化那个类,插件就可以使用了。
当然,您可能还想实现某种沙箱,以便限制插件可以做什么和不能做什么。我创建了一个小的test application(和blogged about it),它由两个插件组成,其中一个被拒绝访问本地资源。
【讨论】:
你提到的沙箱其实是最难的部分!但不要担心——如上所述,osgi 已经为您做到了。 沙盒并不难。我花了大约两周的时间才知道如何正确地做到这一点,但一旦你知道这很简单。 :) @Bombe 这个示例应用程序还在任何地方吗? * 使用bugs.freenetproject.org/print_bug_page.php?bug_id=1900的附件 @timberwo7ves 我不明白你的意思。文件测试应用程序仍然可以从帖子中给出的位置以及您提到的页面下载。【参考方案6】:从 1.6 开始,如果您想编写自己的简单系统,可以使用 java.util.ServiceLoader。
但如果您想要的不仅仅是基本功能,请使用现有框架之一。
【讨论】:
【参考方案7】:几年前我开始了一个这样的项目,我希望很快就能准备好。我受到了 NetBeans 和 Eclipse 等项目的启发,但与此同时,它变成了一些不同的东西。 OSGi 现在看起来是个不错的选择,但我没有机会将它与我的项目进行比较。它与上面提到的 JPF 相似,但同时在很多方面有所不同。
激励我的基本想法是尽可能简单地构建 Java 应用程序,在 Web 应用程序、桌面应用程序或小程序/JWS 应用程序之间没有分离(当然这还没有涵盖 UI)作为核心功能。
我建立这个项目时心中有几个目标:
无论您构建 Web 应用程序还是桌面应用程序,您都应该以相同的方式启动应用程序,一个普通的 main 方法,没有花哨的 web.xml 声明(并不是说我反对拥有一个标准的 Web描述符,但它不适用于插件系统,您可以在其中添加“servlet” - 我称它们为 RequestHandler(s) - 随意动态)。 易于围绕“扩展点”插入“扩展” - 来自 Eclipse,但方法不同。 可自我部署,因为所有插件都已注册(XML 文件),所以应用程序必须能够独立于构建系统进行自我部署——当然还有 Ant 任务和 Maven MOJO,它们是与我们世界的联系,但最终它会调用应用程序并指示它在特定位置自行部署。 从 Maven 借来的,它可以从存储库(包括 Maven 1 和 2 存储库)下载代码,因此只要您可以访问存储库,您的应用程序就可以部署为单个小 jar(有时很有用,基本上这提供了支持自动更新 - 你不喜欢你的网络应用程序通知你有一个更新的版本,它已经下载并且只需要你的许可来安装它吗?我知道我喜欢这个)。 关于系统运行状况的基本应用程序监控、失败时的电子邮件通知【讨论】:
【参考方案8】:我认为推荐 OSGi 来解决上述问题是非常糟糕的建议。 OSGi 是“正确的选择”,但对于上述场景,我认为 JPF 或一些本土的简约框架就足够了。
【讨论】:
以上是关于使用 Java 构建插件系统的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章