如何为您的Java应用程序实现插件系统?
是否可以有一个易于使用(对于开发人员)的系统,以实现以下功能:
- 用户将其插件放入应用程序的子目录中
- 插件可以提供配置界面
- 如果使用框架,则许可证是否与商业开发兼容?
如何为您的Java应用程序实现插件系统?
是否可以有一个易于使用(对于开发人员)的系统,以实现以下功能:
首先,您需要一个所有插件都需要实现的接口,例如:
public interface Plugin {
public void load(PluginConfiguration pluginConfiguration);
public void run();
public void unload();
public JComponent getConfigurationPage();
}
插件作者应该将他们的插件打包为JAR文件。您的应用程序打开JAR文件,然后可以使用JAR清单中的属性或JAR文件中所有文件的列表来查找实现您的Plugin接口的类。实例化该类,插件即可使用。
当然,您还可能希望实现某种沙箱机制,以限制插件能够进行的操作。我创建了一个小的测试应用程序(并在博客中介绍),其中包含两个插件,其中一个被拒绝访问本地资源。
使用 OSGi。
它是Eclipse插件系统的基础。 Equinox 是Eclipse的实现(以EPL许可证授权),而Felix是Apache项目的实现(以Apache Public License许可证授权)。
Eclipse提供了一个具体的例子,表明OSGi可以覆盖您所提到的点(或者如果您想要完整的Eclipse / SWT / JFace堆栈,可以在其上构建应用程序 Eclipse RCP)。
使用PF4J。 它支持Web、Spring和Wicket。 易于使用和构建应用程序。
我花了一周时间学习OSGi-一周的紧张,全身心投入到OSGi中。最后感觉像是一场噩梦,但我学到了很多。
我成功地让OSGi运行起来了(不容易,所有的示例都已过时,网上的一切都至少有三年甚至五年),但我在将它集成到现有项目中遇到了严重的问题,因为JAR清单存在问题。
简言之,只有一些晦涩难懂的工具用于构建清单,并且它们没有很好的文档(BND Tools并不算晦涩,但它是为Eclipse中的某个特定流程而设计的)。此外,大多数可用的OSGi信息并不面向那些拥有现有桌面应用程序的应用开发人员。
这使得大量的信息背景模糊或不适当。Neil Bartlett的博客文章帮助最大,但即使那些也无法获得一个工作系统(我从Felix教程中获取了一些代码并将其组合在一起以获取嵌入式框架滚动)。我找到了他多年前免费发布的书稿,非常优秀,但Eclipse OSGi支持的更改导致Eclipse中的示例代码不起作用。
我认为推荐OSGi来解决上述问题是极其不合适的建议。OSGi确实是“正确的选择”,但对于像上述场景这样的情况,我认为JPF或某些自己开发的最小化框架已经足够了。