【发布时间】:2015-10-14 20:52:01
【问题描述】:
您将如何为您的 Java 应用程序实现插件系统?
是否有可能拥有一个易于使用(对于开发人员)的系统,它可以实现以下目标:
- 用户将他们的插件放到应用程序的子目录中
- 插件可以提供配置屏幕
- 如果您使用框架,许可证是否与商业开发兼容?
【问题讨论】:
标签: java design-patterns plugins frameworks plugin-architecture
您将如何为您的 Java 应用程序实现插件系统?
是否有可能拥有一个易于使用(对于开发人员)的系统,它可以实现以下目标:
【问题讨论】:
标签: java design-patterns plugins frameworks plugin-architecture
我在 OSGi 上工作了一周——这是一个紧张的、不过是 OSGi 的一周。最后,这就像一场噩梦,但我学到了很多。
我能够让 OSGi 工作(不容易,所有示例都已过时,网络上的所有内容如果不是 5 年,至少也有 3 年的历史),但我很难将它集成到现有项目中,因为jar 清单的问题。
简而言之,用于构建清单的工具很少,并且没有很好的文档记录(BND 工具几乎不晦涩,但它是为 Eclipse 中的某个进程设计的)。此外,大多数可用的 OSGi 信息并不针对拥有现有桌面应用程序的应用程序开发人员。
这使得信息的很多上下文模糊或不恰当。 Neil Bartlett 的博客文章是最大的帮助,但即使是那些也未能获得一个工作系统(我从 Felix 教程中获取了一些代码并将它们拼凑在一起以使嵌入式框架滚动)。我找到了他多年前免费发布的书稿,非常好,但是由于 Eclipse OSGi 支持的变化,Eclipse 中的示例无法正常工作。
【讨论】:
使用PF4J。 它支持 Web、Spring 和 Wicket。 易于使用和构建应用程序
【讨论】:
使用OSGi。
它是Eclipse插件系统的基础。 Equinox 是 Eclipse 的实现(获得许可的 EPL),Felix 是 Apache 项目的实现(获得许可的 Apache Public License)。
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 文件中所有文件的列表来查找实现插件接口的类。实例化那个类,插件就可以使用了。
当然,您可能还想实现某种沙箱,以便限制插件可以做什么和不能做什么。我创建了一个小的test application(和blogged about it),它由两个插件组成,其中一个被拒绝访问本地资源。
【讨论】:
从 1.6 开始,如果您想编写自己的简单系统,可以使用 java.util.ServiceLoader。
但如果您想要的不仅仅是基本功能,请使用现有框架之一。
【讨论】:
几年前我开始了一个这样的项目,我希望很快就能准备好。我受到了 NetBeans 和 Eclipse 等项目的启发,但与此同时,它变成了一些不同的东西。 OSGi 现在看起来是个不错的选择,但我没有机会将它与我的项目进行比较。它与上面提到的 JPF 相似,但同时在很多方面有所不同。
激励我的基本想法是尽可能简单地构建 Java 应用程序,在 Web 应用程序、桌面应用程序或小程序/JWS 应用程序之间没有分离(当然这还没有涵盖 UI)作为核心功能。
我建立这个项目时心中有几个目标:
【讨论】:
我认为推荐 OSGi 来解决上述问题是非常糟糕的建议。 OSGi 是“正确的选择”,但对于上述场景,我认为 JPF 或一些本土的简约框架就足够了。
【讨论】: