使用Java构建插件系统的最佳方法

问题

你将如何为Java应用程序实现插件系统?

是否可以有一个易于使用(对于开发人员)系统,实现以下目标:

  • 用户将他们的插件放入应用程序的子目录中
  • 插件可以提供配置屏幕
  • 如果你使用框架,许可证是否与商业开发兼容?

#1 热门回答(92 赞)

首先,你需要一个所有插件都需要实现的接口,例如

public interface Plugin {
    public void load(PluginConfiguration pluginConfiguration);
    public void run();
    public void unload();
    public JComponent getConfigurationPage();
}

插件作者然后应该将他们的插件捆绑到JAR文件中。你的应用程序打开JAR文件,然后可以使用JAR清单中的属性或JAR文件中所有文件的列表来查找实现Plugin接口的类。实例化该类,该插件已准备就绪。

当然,你可能还希望实现某种沙盒,以便插件受限于它能够做什么和不能做什么。我创建了一个包含两个插件的smalltest application(和blogged about it),其中一个插件被拒绝访问本地资源。


#2 热门回答(41 赞)

UseOSGi

它是Eclipse插件系统的基础.Equinox是Eclipse的实现(许可的EPL)和Felix是Apache Project的实现(许可的Apache公共许可证)。

Eclipse提供了一个具体的例子,OSGi可以涵盖你提到的要点(或者如果你想要一个完整的Eclipse / SWT / JFace堆栈,你可以在Eclipse RCP之上构建你的应用程序)。


#3 热门回答(28 赞)

从1.6开始,如果你想编写自己的简单系统,可以使用java.util.ServiceLoader

但是,如果你需要的不仅仅是基本功能,请使用现有框架之一。