OSGi 片段是一个具有特定清单头的 Java™ 归档文件,这些清单头使其能够连接至指定的主机捆绑软件以工作。
片段将被视为主机捆绑软件的一部分。如果信息不冲突的话,片段的相关定义会在解析主机之前与主机捆绑软件定义合并。
将尽可能解析片段依赖关系。如果不能解析片段依赖关系,那么该片段不会连接至主机捆绑软件。片段不能具有自己的类装入器或捆绑软件激活器。它不能覆盖显示在主机捆绑软件中的信息。片段会使用资源、类和许可的头来扩展捆绑软件,这使您能够定制捆绑软件。
OSGi 片段清单文件
OSGi 片段 JAR 文件包含片段清单文件。此文件包含使 OSGi 框架能够将片段连接至主机捆绑软件的元数据。
以下代码是捆绑软件清单文件
META-INF/MANIFEST.MF 的内容的示例:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Fragment
Bundle-SymbolicName: Fragment
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Fragment-Host: WebBundle;bundle-version=1.0.0.qualifier
Import-Package: org.apache.commons.logging;version="1.0.4"
Export-Package: com.sample.myservice.api;version="1.0.0"
此清单文件中的元数据包括以下键属性:
- Fragment-Host
- 将片段链接至它的潜在捆绑软件主机。
- Bundle-Version
- 描述片段的版本并在同一框架实例中允许多个版本的捆绑软件同时处于活动状态。
- Bundle-Name
- 提供片段的人类可读名称。
- Bundle-SymbolicName
- 在框架中唯一标识片段。有了它仍然需要 Bundle-Name 头。
- Import-Package
- 为片段解决方案声明 OSGi 框架所使用的片段的外部依赖关系。可以声明每个软件包的特定版本或版本范围。在此示例清单文件中,要求 org.apache.commons.logging 软件包处于 V1.0.4 或更高版本。
- 使用此属性可指定您要使片段从运行时导入的任何软件包的名称。如果在此属性中未指定捆绑软件所需的软件包,那么可能会在捆绑软件装入时遇到 NoClassDefFound 异常和编译错误。
注: 还必须在包含软件包的捆绑软件的 Export-Package 属性中指定此软件包。
限制: 如果捆绑软件清单文件使用 Import-Package 属性来声明不在工作空间或目标平台内的捆绑软件的捆绑软件依赖关系,那么编辑器会将该依赖关系标记为错误。要解决此限制,请确保您作为依赖关系进行声明的所有捆绑软件都位于工作空间内,或者使用快速修复将该捆绑软件添加至目标平台。要使用快速修复,请切换至“标记”视图,然后右键单击错误标记并选择快速修复。
要点: 在
MANIFEST.MF 文件中指定捆绑软件依赖关系时,请使用
Import-Package 属性,而不要使用
Require-bundle。如果使用
Require-bundle 来指定捆绑软件依赖关系,那么您的应用程序可能不部署。
Import-Package 是更灵活的用于声明依赖关系的方式:
- 您可以对所需的功能声明依赖关系,而不必对该功能源自的捆绑软件声明依赖关系,因为它不添加对您的捆绑软件不需要但却包含在相依捆绑软件中的软件包的不必要依赖关系。
- 您可以指定所声明软件包的版本或版本范围,因此您不必对不同版本的捆绑软件中的更改做出反应。
- Export-Package
- 声明在片段外部可视的软件包。此处未声明的任何软件包仅在片段内可视。
- 使用此属性可指定您要使片段导出到运行时的任何软件包的名称。如果未在此属性中指定其他捆绑软件所需的软件包,那么可能不解析相依捆绑软件。