插件和 bundle

支持插件的机制是通过使用 OSGi 框架实现的。从这一点上来说,插件是与 OSGi bundle 相同的。bundle 及其相关联的类指定并实现 Java 类装入的过程、先决条件管理和 bundle 的生命周期。在此讨论的其余部分,除非是讨论框架中的特定类,否则我们将交替使用术语插件bundle

插件

Plugin 类表示正在平台中运行的插件。通过它可以很方便地将插件的生命周期方面的内容和总体语义集中起来。插件可以实现其生命周期的启动停止方面的特殊功能。每个生命周期方法都包括对 BundleContext(它可以提供更多信息)的引用。

生命周期的启动部分是值得特别讨论的。我们已看到有关插件的信息可以从插件的清单文件中获的而不必运行任何插件的代码。通常,工作台中的某些用户操作会导致需要启动插件的一系列事件。从实现角度来看,只有在需要装入包含在插件中的类时,才会启动该插件。

start 方法可以很方便地实现插件的初始化和注册行为。但是,认识到可以在许多不同的情况下启动插件是很重要的。象获取修饰对象的图标一样简单的操作就可以导致装入插件的某一个类,这样就会启动插件。过早进行初始化会导致在需要装入插件的代码和数据之前很早就装入它们。因此,一定要仔细查看插件的初始化任务并考虑启动时执行初始化的替代方法。

Bundle 上下文

生命周期管理是 OSGi“bundle”术语和平台的“插件”术语汇合的位置。当插件启动时,会为该插件提供对 BundleContext(从它可以获得与插件相关的信息)的引用。BundleContext 还可以用来查明系统中的其它 bundle/插件。

BundleContext.getBundles() 可以用来获得系统中的所有 bundle 的集合。可以注册 BundleEvent 的侦听器,以便插件知道何时在其生命周期状态中另一个 bundle 发生了更改。有关更多信息,请参阅 BundleContextBundleEvent 的 Javadoc。

在 3.0 之前,提供了插件注册表(IPluginRegistry)来提供类似的信息。例如,可以查询它以获得系统中所有插件的插件描述符。现在,不推荐使用此注册表,应该使用 BundleContext 来达到此目的。平台注册表现在专用于提供有关扩展和扩展点的信息。

Bundle 激活器

BundleActivator 接口定义在 Plugin 中实现的启动和停止行为。尽管 Plugin 类很容易实现此功能,但是,插件开发者可以完全自由地在适合于插件设计的任何类中实现 BundleActivator 的接口。实际上,如果插件没有特定的生命周期管理需要,它就根本不需要实现此接口。

Bundle

在每个插件中都存在一个由框架管理的 OSGi bundle。Bundle 是 OSGi 模块单元。从根本上来说,bundle 只是安装在平台中的文件(资源和代码)的集合。每个 bundle 都具有它自己的 Java 类装入器,并且包括用于启动、停止和卸载它本身的协议。从 Eclipse 平台的角度来说,Bundle 只不过是一个实现类。插件开发者不扩展 bundle 类,但是使用 Plugin 或其它 BundleActivator 实现来表示插件。