OSGi 理论: 模块元数据 (Bundle's manifest file)

OSGi 模块或者说 Bundle: 由 Java 字节码组成的相关的服务组件和依赖库,并通过 OSGi 元数据条目进行描述,按逻辑单元打包并部署的 JAR 文件

OSGi 模块元数据

由于篇幅原因,未详尽之处请参考 The OSGi Alliance OSGi Core - Release 6 的 3.2 小节

存放于标准 JAR 文件的 manifest file

META-INF/MANIFEST.MF
一个 bundle 元数据实例
$ java -jar bnd-2.4.0.jar print alipay2-1.4.0.jar
[MANIFEST alipay2-1.4.0]
Bnd-LastModified                         1457335746729
Build-Jdk                                1.8.0_66
Built-By                                 steven
Bundle-Blueprint                         OSGI-INF/blueprint/context.xml
Bundle-Category                          Aves :: Pitta
Bundle-Description                       The Alipay barcode pay 2 implementations
Bundle-DocURL                            http://git.abacus.com.cn
Bundle-ManifestVersion                   2
Bundle-Name                              Pitta :: Barcode Pay :: Alipay 2
Bundle-SymbolicName                      org.aves.pitta.alipay2
Bundle-Vendor                            SiChuan Abacus Aves Team
Bundle-Version                           1.4.0
Created-By                               Apache Maven Bundle Plugin
Export-Service                           org.aves.pitta.api.RemotePaymentServiceDelegate;paysrvCode=102,org.aves.pitta.api.RemotePaymentPendingHolder;paysrvCode=102
Import-Package                           javax.json;version="[1.0,2)",org.apache.http,org.apache.http.client;version="[4.5,5)",org.apache.http.client.entity;version="[4.5,5)",org.apache.http.client.methods;version="[4.5,5)",org.apache.http.impl.client;version="[4.5,5)",org.apache.http.message,org.apache.http.util,org.apache.log4j;version="[1.2,2)",org.aves.iora.base;version="[1.3,2)",org.aves.iora.security;version="[1.3,2)",org.aves.iora.util;version="[1.3,2)",org.aves.pitta.api;version="[1.4,2)",org.osgi.service.blueprint;version="[1.0.0,2.0.0)",org.slf4j;version="[1.7,2)"
Import-Service                           org.aves.pitta.api.NativeRepository;multiple:=false
Manifest-Version                         1.0
Require-Capability                       osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Tool                                     Bnd-3.0.0.201509101326                  

[IMPEXP]
Import-Package
  javax.json                             {version=[1.0,2)}
  org.apache.http
  org.apache.http.client                 {version=[4.5,5)}
  org.apache.http.client.entity          {version=[4.5,5)}
  org.apache.http.client.methods         {version=[4.5,5)}
  org.apache.http.impl.client            {version=[4.5,5)}
  org.apache.http.message
  org.apache.http.util
  org.apache.log4j                       {version=[1.2,2)}
  org.aves.iora.base                     {version=[1.3,2)}
  org.aves.iora.security                 {version=[1.3,2)}
  org.aves.iora.util                     {version=[1.3,2)}
  org.aves.pitta.api                     {version=[1.4,2)}
  org.osgi.service.blueprint             {version=[1.0.0,2.0.0)}
  org.slf4j                              {version=[1.7,2)}

以上为使用 Bnd (Bundle - removing the vowels) 输出以前项目其中的一个模块的元数据

初看有点象药品的说明书。不过这是交给 OSGi 运行时去识别的。我们在这儿只是将此作为案例,取其中主要的条目进行说明。

Bundle-Blueprint 一个类似于 Springframework 的组件管理容器,提供 Enterprise OSGi specifications 实现,详细请参考 Apache Aries 项目。

类似的还有 Apache Felix SCRApache Felix Dependency ManagerApache Felix iPOJO

Bundle-Category, Bundle-Description, Bundle-DocURL, Bundle-Name, Bundle-Vendor 是关于这个模块的说明信息,有助于部署人员了解模块。
Bundle-ManifestVersion, Bundle-SymbolicNameBundle-Version 组合成 bundle 的唯一性标识符(Identification),用于 OSGi 运行时识别模块和其他一致性检查等。
Import-Package 当前这个模块所依赖的由其它或系统 bundles 提供的包,也就是说只有当引入了这些包,我才拥有这些包内类(class)的访问权 (注:Java 标准API由 OSGi 运行时代为引入,不需要在此申明)
Export-Package 当前这个模块没有这个条目,也就是说当前这个 bundle 的所有代码为私有,是一个服务接口的实现模块。并且通过 blueprint 完成服务注册。
Export-Service 这个已经没有使用了,留下只是为了兼容以前的版本。当前是通过 blueprint 完成服务注册。

我们再看看部署后,由 OSGi 的运行时输出的报告

Karaf console

karaf@root()> bundle:headers 243
Pitta :: Barcode Pay :: Alipay 2 (243)
--------------------------------------
Bnd-LastModified = 1456980670717
Build-Jdk = 1.8.0_66
Built-By = steven
Created-By = Apache Maven Bundle Plugin
Manifest-Version = 1.0
Tool = Bnd-3.0.0.201509101326

Bundle-Blueprint = OSGI-INF/blueprint/context.xml
Bundle-Category = Aves :: Pitta
Bundle-Description = The Alipay barcode pay 2 implementations
Bundle-DocURL = http://git.abacus.com.cn
Bundle-ManifestVersion = 2
Bundle-Name = Pitta :: Barcode Pay :: Alipay 2
Bundle-SymbolicName = org.aves.pitta.alipay2
Bundle-Vendor = SiChuan Abacus Aves Team
Bundle-Version = 1.4.0.SNAPSHOT

Export-Service =
    org.aves.pitta.api.RemotePaymentPendingHolder;paysrvCode=102,
    org.aves.pitta.api.RemotePaymentServiceDelegate;paysrvCode=102
Import-Service =
    org.aves.pitta.api.NativeRepository;multiple:=false
Require-Capability =
    osgi.ee;filter:=(&(osgi.ee=JavaSE)(version=1.8))

Import-Package =
    javax.json;version="[1.0,2)",
    org.apache.http,
    org.apache.http.client;version="[4.5,5)",
    org.apache.http.client.entity;version="[4.5,5)",
    org.apache.http.client.methods;version="[4.5,5)",
    org.apache.http.impl.client;version="[4.5,5)",
    org.apache.http.message,
    org.apache.http.util,
    org.apache.log4j;version="[1.2,2)",
    org.aves.iora.base;version="[1.3,2)",
    org.aves.iora.security;version="[1.3,2)",
    org.aves.iora.util;version="[1.3,2)",
    org.aves.pitta.api;version="[1.4,2)",
    org.osgi.service.blueprint;version="[1.0.0,2.0.0)",
    org.slf4j;version="[1.7,2)"

这些有什么用?

  1. 我们的模块有身份了,不在是个三无产品。药品的说明书算是条目最多,内容最详细的说明书了,原因你我都知道。这个元数据不是有点一样吗?
  2. 我们不用在担心运行期的类连接错误,因为我们有[1.4,2)这样的版本控制。
  3. 模块与模块之间优雅的遵守着外交礼仪打交道。
  4. 为部署于 OSGi 运行环境下的生命周期管理和服务管理做好了准备
时间: 2024-10-29 21:43:31

OSGi 理论: 模块元数据 (Bundle's manifest file)的相关文章

OSGi 理论: 一些认知

什么是 OSGi 开放式服务网关工作小组 Open Service Gateway Initiative Java动态模块 Enabled greater dynamic modularity in Java 为我们带来的帮助 建立面向服务(SOA in VM)模块化的 Java 应用 帮助我们分离接口和实现 更好的使用基于接口的开发模式,创建模块和管理应用 将要软件要处理的每个具体问题放入分离的逻辑单元 每个逻辑单元具有自已的逻辑边界 逻辑单元保持简单和可维护性(Unix Slang: do

OSGi 理论: 分层

OSGi 架构分层 模块层 (Module Layer) 生命周期层 (Lifecycle Layer) 服务层 (Service Layer) 模块层 关注于代码包和重用代码 模块在 OSGi 中被称为 bundle 模块包含: 元数据.类文件和资源文件 模块向外部申明可见包 (exported packages) 和依赖包 (imported packages) 模块解析: 进行导入.导出包的一致性检查 生命周期控制层 关注于模块在运行期的安装.更新.初始化.销毁等过程管理 通过 (inst

OSGi如何动态更新bundle

问题描述 我现在有一个OSGi容器已经加载运行的bungle,menifest.mf文件:Manifest-Version:1.0Require-Bundle:XJMeritDMP;bundle-version="1.0.0",org.eclipse.gef;bundle-version="3.6.1",org.eclipse.ui;bundle-version="3.6.1",org.eclipse.core.runtime;bundle-ve

OSGi 实践:包装 OSGi bundle

阅读本节需要一些上下文知识,推荐阅读: OSGi 理论: 一些认知 OSGi 理论: 分层 我们曾在 OSGi 理论: 模块元数据 (Bundle's manifest file) 中讨论过关于 OSGi bundle 元数据.这些元数据用于模块部署人员了解模块,以及 OSGi 运行时识别.连接模块和其约束性检查等.但在实践中我可能会遇到一些我们目标模块所依赖的 JARs 并没有写入这些元数据(比如:一些厂商的 JDBC Driver等),也就是说这些 JARs 不能直接用 OSGi 运行环境.

《深入理解OSGi:Equinox原理、应用与最佳实践》一2.2 Bundle

2.2 Bundle 从本节开始,一直到本书结束,我们都会不断地提起"Bundle"这个词.Bundle是OSGi中最基本的单位,通俗地讲,如果说OSGi是基于Java平台的"模块化开发体系",那么Bundle便是其中的"模块". OSGi中的Bundle是在JAR文件格式规范基础上扩展而来的,一个符合OSGi规范的Bundle首先必须是一个符合JAR文件格式规范的JAR包.与JAR文件格式兼容这点虽然没有太多技术含量可言,但是这个简单的举措极大

《深入理解OSGi:Equinox原理、应用与最佳实践》一3.2 Bundle状态及转换

3.2 Bundle状态及转换 "状态"是Bundle在运行期的一项动态属性,不同状态的Bundle具有不同的行为.生命周期层规范定义了Bundle生命周期过程之中的6种状态,分别是:UNINSTALLED(未安装).INSTALLED(已安装).RESOLVED(已解析).STARTING(启动中).STOPPING(停止中).ACTIVE(已激活),它们的含义为: UNINSTALLED,未安装状态.处于未安装状态的Bundle导出的Package和包含的其他资源都是不可使用的.但

《深入理解OSGi:Equinox原理、应用与最佳实践》一2.4 Bundle的组织与依赖

2.4 Bundle的组织与依赖 既然是以模块化方式开发一个系统,那么必不可少的步骤是根据业务和技术的需要,将系统划分为多个模块,通过这些模块互相协作完成系统的功能.系统中绝大部分模块都不是孤立的,通常会依赖其他模块所导出的某些Package,又会被另外一些模块所依赖.这种依赖关系在元数据配置中简单体现为Import-Package.Export-Package和Require-Bundle标记的配置,使用起来并不算复杂,但是各个OSGi框架的实现者都要花费大量心思在组织Bundle与管理依赖上

《深入理解OSGi:Equinox原理、应用与最佳实践》一3.5 系统Bundle

3.5 系统Bundle OSGi框架本身也会以一个Bundle的形式向其他Bundle提供资源.Package和服务,比如已经在书中多次出现的Bundle.BundleContext.FrameworkListener等接口,以及后面将会介绍的EventAdmin.PackageAdmin等服务都是由系统Bundle提供的.OSGi规范规定了系统Bundle的Bundle ID固定为0,Bundle的getLocation()方法返回固定字符串"System Bundle",这些特征

通过实例讲解如何在OSGi应用中使用EJB技术

使用 WAS V8.5 的 OSGi 功能,不仅能够将已有的 EJB 模块转化为以 OSGi Bundle 为单位的 OSGi 应用,也可以结合 Rational Development 工具直接开发基于 EJB 的 OSGi 应用.在本文中,我们首先介绍 WAS V8.5 在 OSGi 编程方面的增强,然后通过实例讲解如何在 OSGi 应用中使用 EJB 技术. WebSphere Application Server V8.5 对 OSGi 一个最重要的增强就是提供了对 EJB3.x 的支持