一、OSGi 规范
OSGi(Open Service Gateway Initiative) 技术是 Java 动态化模块化系统的一系列规范。OSGi 一方面指维护 OSGi 规范的 OSGi Alliance(OSGi 联盟),另一方面指的是该组织维护的基于 Java 语言的服务(业务)规范。简单来说,OSGi 可以认为是 Java 平台的模块层,为大型分布式系统以及嵌入式系统提供一种模块化架构减少了软件的复杂度。
1. 什么是 OSGi
OSGi 联盟(OSGi Alliance)于 1999 年开始着手制定 OSGi 规范,其主要目的就是要制定一套开放式标准,以便向局域网及其中的设备提供可管理的服务;其基本思路是,一旦您在网络设备(如服务器和嵌入式设备)上使用了 OSGi 服务平台,您就可以在网络上的任何地方管理这些设备上运行的软件组件的生命周期,可以在后台对这些组件进行安装、升级或卸载,但不需要打断该设备的正常运行。Eclipse 就是基于 OSGi 开发的。
2. OSGi 标准
OSGI R1 于 2000 年发布,现在最新的标准版本是 R5,到现在为止应用最广泛的当属是 2005 年发布的 R4。
其中主要定义了 OSGi 框架。OSGi 框架提供了一个通用安全可管理的 java 框架,能够支持可扩展可下载的应用(即 bundles)的部署。OSGi 框架是 OSGi 技术最基础也是最核心的部分。
这里你需要理解 OSGi 框架的三个最重要部分:模块层、生命周期层、服务层。
-
模块层 :关注打包和代码共享。
OSGi 是严格要求模块化的,模块有个专有名词 bundle。每个模块都是一个 bundle,一个 Business Logic 由多个 bundle 来实现。
注:后面全部使用 bundle 代替模块来表述。
-
生命周期层 :关注提供执行模块管理和对底层 OSGi 框架的访问。
bundle 是需要 OSGi 进行解析的,每个 bundle 在变得可用之前,都需要完整经历该生命周期。
-
服务层 :关注模块,特别是模块内的组件的交互和通讯。
OSGi 技术全面贯彻了 SOA,每个 bundle 都是其他 bundle 提供服务,夸张一点说,不提供服务的 bundle 就没有存在的价值。
2.1 OSGi 三层架构-模块层
模块化其实就是计算机科学中常见的一个概念:将一个大型系统分解为多个较小的互相协作的逻单元,通过强制设定模块之间的逻辑边界来改善系统的维护性和封装性。
模块层定义了 OSGi 中的模块 bundle:
-
bundle 是以 jar 包形式存在的个模块化物理单元,里面包含了代码,资源文件和元数据(metadata),井且 jar 包的物理边界也同时是运行时逻辑模块的封装边界。
-
bundle 是开发、部署 OSGi 应用的基本单元。
-
bundle 的核心是 META-NF 目录下的 MANIFEST.MF 文件。
-
bundle 定义了其所包含的包的可见性、可以认为是在 public/private/protected 的基础上的一个扩展。
-
bundle 的 java 包共享、屏蔽的规则。通过 Export-Package、Import-Package 方式进行交互。
-
每个 bundle 都有单独的类加加载器。
来看看在 MANIFEST.MF 中可以定义哪些 Bundle 的的元数据信息:
属性 | 属性描述 |
---|---|
Bundle-Activator | Bundle 的 Activator 类名 |
Bundle-Category | Bundle 的分类属性描述 |
Bundle-Classpath | Bundle 的 Classpath |
Bundle-Copyright | Bundle 的版权 |
Bundle-Description | Bundle 的描述信息 |
Bundle-DocURL | Bundle 的文档 URL 地址 |
Bundle-Localization | Bundle 的国际化文件 |
Bundle-ManifestVersion | 定义 Bundle 所遵循的规范的版本, OSGI R3 对应的值为1, OSGI R4 对应的值为2 |
Bundle-Name | Bundle的有意义的名称 |
Bundle-NativeCode | Bundle 所引用的 Native Code 的地址 |
bundle-RequiredExecutionEnvironment | Bundle 运行所需要的环境,如可指定为需要 OSGI R3、Java1.4、Java1.3 等 |
Bundle-SymbolicName | Bundle 的唯一标识名,可采用类似 java package 名的机制来保证唯一性 |
Bundle-Version | Bundle 的版本 |
Dynamiclmport-Package | Bundle 动态引用的 package |
Export-Package | Bundle对外暴露的 package |
Fragment-Host | Fragment 类型 Bundle 所属的 Bundle 名 |
Import-Package | Bundle 引用的 package |
Require-Bundle | Bundle 所需要引用的其他的 Bundle |
2.2 OSGi 三层架构-生命周期
状态是 Bundle 在运行期的一项动态属性,不同状态的 Bundle 具有不同的行为,生命周期层规范定义了 Bundle 生命周期过程之中的 6 种状态。
OSGi 生命周期层有两种不同的作用:
-
在应用程序外部,定义了对 bundle 生命周期的相关操作。OSGi 生命周期层允许在执行时,从外部安装、启动、更