动态内容管理
通常,您会通过在功能部件清单文件的 Subsystem-Content 头中列示捆绑软件以将捆绑软件安装到运行时环境中。但是,您还可通过将用户编写捆绑软件作为用户编写功能部件的 Subsystem-Content 的一部分来动态添加和移除 OSGi 捆绑软件。用户编写捆绑软件包含 OSGi 捆绑软件上下文以安装和控制其他捆绑软件。
在 Liberty 概要文件中安装、启动、停止和卸载捆绑软件
注: 在以下部分中,用户编写功能部件称为 UserFeatureA,用户编写捆绑软件称为 FeatureBundleA。
- 安装捆绑软件
- 通过使用下列其中一个方法,可编写 FeatureBundleA 以获取 OSGi 捆绑软件上下文 org.osgi.framework.BundleContext:
- 实现 BundleActivator 接口 org.osgi.framework.BundleActivator。启动方法的 BundleContext 参数由 OSGi 框架传递,用户编写捆绑软件激活时此参数对该捆绑软件可用。有关 BundleActivator 接口的更多信息,请参阅开发使用简单激活的 OSGi 捆绑软件。
- 实现可用规范(例如,OSGi 声明式服务或 Blueprint),此规范允许您通过另一方法或接口访问捆绑软件上下文。有关更多信息,请参阅使用 OSGi 声明式服务来编写高级功能部件和 Blueprint 捆绑软件。
FeatureBundleA 获取捆绑软件上下文后,可使用 installBundle(String location) 或 installBundle(String location, InputStream stream) 方法来安装其他捆绑软件。
动态安装的捆绑软件会在缺省重新启动时恢复状态。它们在干净启动后不会保留,需要重新安装。有关更多详细信息,请参阅捆绑软件高速缓存。
- 启动捆绑软件
- 如果要启动已安装捆绑软件,应由安装捆绑软件 FeatureBundleA 对该捆绑软件调用 start 方法。
- 停止和卸载捆绑软件
- 如果已从服务器配置中移除用户编写功能部件 UserFeatureA,那么 FeatureBundleA 会停止并且还会卸载。卸载
FeatureBundleA 会导致卸载 FeatureBundleA 安装的所有捆绑软件(如果它们尚未卸载)。系统会对每个捆绑软件调用
org.osgi.framework.Bundle.uninstall() 方法,此方法会停止并卸载该捆绑软件。如果通过任何其他手段卸载
FeatureBundleA,那么此卸载过程也适用。
如果服务器停止时从服务器配置中移除 UserFeatureA,那么系统会在下一次服务器启动时移除 UserFeatureA 安装的捆绑软件。如果捆绑软件的启动级别仍为缺省值,那么系统会在捆绑软件重新启动前将其移除。如果捆绑软件的启动级别已修改,那么系统可能在捆绑软件重新启动后才会将其移除。
FeatureBundleA 根据 OSGi 核心规范使用 org.osgi.framework.Bundle 和 org.osgi.framework.BundleContext 接口执行其他生命周期管理任务。
Liberty 概要文件中的捆绑软件高速缓存、包可视性及编程模型支持
- 捆绑软件高速缓存
- 服务器关闭时,所有当前安装的捆绑软件会停止,OSGi 元数据会保存至捆绑软件高速缓存。缺省启动时,这些已安装捆绑软件返回至其先前状态。干净启动时,FeatureBundleA 安装的所有捆绑软件会删除其持久数据。因此,干净启动时不会恢复这些捆绑软件。FeatureBundleA 本身会恢复,因为它由功能部件管理器重新安装(只要 UserFeatureA 仍在服务器配置中)。如果要在干净启动后重新安装任何捆绑软件,应由 FeatureBundleA 执行重新安装。系统不会向您发出干净启动的通知,但您可使用 OSGi BundleContext getBundle(String location) 方法来检查是否安装了某个捆绑软件。
- 包可视性
- 动态安装且未列示在功能部件清单文件的 Subsystem-Content 头中的捆绑软件具有以下可视性:
- 动态安装的捆绑软件可导入当前配置的功能部件集提供的任何 API 和 SPI 包。
- 由同一产品扩展内任何其他捆绑软件导出且未声明为 API 或 SPI 的包对动态安装的捆绑软件不可视。
- 从动态安装的捆绑软件导出的包不能声明为 API 或 SPI。
- 导入从动态安装的捆绑软件导出的包时没有任何限制。
- 编程模型支持
- 动态安装的捆绑软件可使用 OSGi 企业规范的实现,只要相应运行时功能部件配置为启用这些捆绑软件。