您将如何为您的 Java 应用程序实现插件系统?
是否有可能拥有一个易于使用(对于开发人员)的系统,它可以实现以下目标:
- 用户将他们的插件放入应用程序的子目录中
- 该插件可以提供一个配置屏幕
- 如果使用框架,许可证是否与商业开发兼容?
您将如何为您的 Java 应用程序实现插件系统?
是否有可能拥有一个易于使用(对于开发人员)的系统,它可以实现以下目标:
首先,您需要一个所有插件都需要实现的接口,例如
public interface Plugin {
public void load(PluginConfiguration pluginConfiguration);
public void run();
public void unload();
public JComponent getConfigurationPage();
}
然后插件作者应该将他们的插件捆绑到 JAR 文件中。您的应用程序打开 JAR 文件,然后可以使用 JAR 清单中的属性或 JAR 文件中所有文件的列表来查找实现插件接口的类。实例化那个类,插件就可以使用了。
当然,您可能还想实现某种沙盒,以便插件限制它可以做什么和不能做什么。我创建了一个包含两个插件的小型测试应用程序(并写了一篇博客),其中一个插件被拒绝访问本地资源。
使用OSGi。
它是 Eclipse 插件系统的基础。Equinox是 Eclipse 的实现(获得许可的 EPL),Felix是 Apache 项目的实现(获得许可的 Apache Public License)。
Eclipse 提供了一个具体示例,OSGi 可以涵盖您提到的要点(或者,如果您想要一个完整的 Eclipse/SWT/JFace 堆栈,您可以在Eclipse RCP之上构建您的应用程序)。
从 1.6 开始,如果您想编写自己的简单系统,可以使用java.util.ServiceLoader 。
但是,如果您想要的不仅仅是基本功能,请使用现有框架之一。
使用PF4J。它支持 Web、Spring 和 Wicket。易于使用和构建应用程序
我在 OSGi 上工作了一周——这是一个紧张的,除了 OSGi 的一周。最后,这就像一场噩梦,但我学到了很多。
我能够让 OSGi 正常工作(不容易,所有示例都已过时,网络上的所有内容都至少有 3 年历史,如果不是 5 年的话),但由于存在问题,我很难将它集成到现有项目中jar 体现。
简而言之,用于构建清单的工具很少,并且没有很好的文档记录(BND 工具并不晦涩,但它是为 Eclipse 中的某个进程设计的)。此外,大多数可用的 OSGi 信息并不针对拥有现有桌面应用程序的应用程序开发人员。
这使得信息的很多上下文模糊或不恰当。Neil Bartlett 的博客文章是最大的帮助,但即使是那些也未能获得一个工作系统(我从 Felix 教程中获取了一些代码并将它们拼凑在一起以使嵌入式框架滚动)。我找到了他多年前免费发布的书稿,非常好,但是由于 Eclipse OSGi 支持的变化,Eclipse 中的示例无法正常工作。
我认为推荐 OSGi 来解决上述问题是非常糟糕的建议。OSGi 是“正确的选择”,但对于上述场景,我认为 JPF 或一些本土的简约框架就足够了。
几年前,我开始了一个这样的项目,我希望很快就能准备好。我受到了 NetBeans 和 Eclipse 等项目的启发,但与此同时,它变得有点不同。OSGi 现在看起来是一个不错的选择,但我没有机会将它与我的项目进行比较。它与上面提到的 JPF 相似,但同时在很多方面有所不同。
激励我的基本想法是尽可能简单地构建 Java 应用程序,不将 Web 应用程序、桌面应用程序或 applet/JWS 应用程序(当然这还不包括 UI)作为核心功能分开。
我建立这个项目时有几个目标: