您将如何为Java应用程序实现一个插件系统?
是否有一个易于使用的(对于开发人员而言)系统可以实现以下目的:
- 用户将其插件放入应用程序的子目录中
- 插件可以提供配置屏幕
- 如果使用框架,则许可证是否与商业开发兼容?
您将如何为Java应用程序实现一个插件系统?
是否有一个易于使用的(对于开发人员而言)系统可以实现以下目的:
Answers:
首先,您需要一个所有插件都需要实现的接口,例如
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 Project的实现(许可的Apache Public License)。
Eclipse提供了一个具体的示例,OSGi可以涵盖您提到的要点(或者,如果您想要完整的Eclipse / SWT / JFace堆栈,则可以在Eclipse RCP之上构建应用程序)。
从1.6开始,出现了java.util.ServiceLoader,如果您想编写自己的简单系统,可以使用它。
但是,如果您需要的不仅仅是基本功能,请使用现有框架之一。
使用PF4J。它支持Web,Spring和Wicket。易于使用和构建应用程序
我在OSGi上工作了一个星期-辛苦了一个星期,除了OSGi。最后,这就像一个噩梦,但我学到了很多东西。
我能够使OSGi正常工作(不容易,所有示例都已过时,网络上的所有内容至少都存在三年以上(如果不是五年的话)),但是由于存在问题,将其集成到现有项目中时遇到了很大的麻烦。罐子清单。
简而言之,只有少数晦涩难懂的工具可用于构建清单,并且它们的文档也没有得到很好的记录(BND Tools很少晦涩难懂,但它是为Eclipse中的特定过程而设计的)。同样,大多数可用的OSGi信息也不针对具有现有桌面应用程序的应用程序开发人员。
这使得大量信息模糊或不适当的上下文。尼尔·巴特利特(Neil Bartlett)的博客文章是最大的帮助,但即使是那些未能获得正常工作的系统,我也从Felix教程中获取了一些代码,并将它们拼凑在一起以使嵌入式框架得以运转。我发现他几年前免费发布的书稿非常好,但是由于Eclipse OSGi支持的变化,Eclipse中的示例不起作用。
每一步都是一个主要的障碍。稍后,我将尝试在此处发布更多详细信息。
几年前,我启动了一个类似的项目,希望很快就可以完成。我受到NetBeans和Eclipse等项目的启发,但与此同时它又有所不同。OSGi现在看起来是一个不错的选择,但我没有机会将其与我的项目进行比较,它与上述的JPF类似,但同时在许多方面都有所不同。
激发我灵感的基本思想是尽可能容易地构建Java应用程序,而将Web应用程序,桌面应用程序或applet / JWS应用程序(当然,这还不包括UI)作为核心功能之间没有任何分离。
我在构建项目时想到了一些目标: