首页 > 代码库 > OSGi简介
OSGi简介
OSGi简介
OSGi是什么
下面来看看“维基百科”给出的解释:
OSGi(Open Service Gateway Initiative)有双重含义。一方面它指OSGi Alliance组织;另一方面指该组织制定的一个基于Java语言的服务(业务)规范——OSGi服务平台(Service Platform)。
OSGi Alliance是一个由Sun Microsystems、IBM、爱立信等于1999年3月成立的开放的标准化组织, 最初名为Connected Alliance。该组织及其标准原本主要目的在于使服务提供商通过住宅网关,为各种家庭智能设备提供各种服务。目前该平台逐渐成为一个为室内、交通工具、移动电话和其他环境下的所有类型的网络设备的应用程序和服务进行传递和远程管理的开放式服务平台。
该规范和核心部分是一个框架 ,其中定义了应用程序的生命周期模式和服务注册。基于这个框架定义了大量的OSGi服务:日志、配置管理、偏好,HTTP(运行servlet)、XML分析、设备访问、软件包管理、许可管理、星级、用户管理、IO连接、连线管理、Jini和 UPnP。
这个框架实现了一个优雅、完整和动态的组件模型。应用程序(称为bundle)无需重新引导可以被远程安装、启动、升级和卸载(其中Java包/类的管理被详细定义)。API中还定义了运行远程下载管理政策的生命周期管理。服务注册允许bundles去检测新服务和取消的服务,然后相应配合。
OSGi原先关注于服务网关,其实可用于多个方面。现在OSGi规范已经用于从移动电话到开源的Eclipse(其中包括了与IBM的OSGi框架SMF兼容的开源版本)。 OSGi服务平台的应用包括:服务网关、 汽车、移动电话、 工业自动化、建筑物自动化、PDA 网格计算、娱乐(如iPronto)、和 IDE。
OSGi规范是由成员通过公开的程序开发,对公众免费而且没有许可证限制。但是OSGi Alliance的兼容性程序只对成员开放,目前有12个兼容的实现。
2003年Eclipse选择OSGi作为其插件的底层运行时架构。Equinox project对该理念进行了实验,2004年6月在Eclipse3 R3中发布。ProSyst是面向OSGi开发者的Eclipse插件。
2003年10月, 诺基亚、摩托罗拉,ProSyst 和其他OSGi成员组建了Mobile Expert Group (MEG)为下一代智能手机规范业务平台,做为对 MIDP 和CDC的补充。
OSGi的主要职责就是为了让开发者能够建动态化、模块化的Java系统。
OSGi的组成
通常,OSGi 框架从概念上可以分为三层:模块层、生命周期层和服务层。各层的主要功能如下:
<!--[if !supportLists]-->? <!--[endif]-->Module Layer —— 模块层主要涉及包及共享的代码;
<!--[if !supportLists]-->? <!--[endif]-->Lifecycle Layer —— 生命周期层主要涉及 Bundle 的运行时生命周期管理;
<!--[if !supportLists]-->? <!--[endif]-->Service Layer —— 服务层主要涉及模块之间的交互和通信。
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="http://static.oschina.net/uploads/img/201111/18175002_MIP6.jpg" style=‘width:359.25pt;height:280.5pt‘> <v:imagedata src="file:///C:\Users\itway\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg" o:href="http://static.oschina.net/uploads/img/201111/18175002_MIP6.jpg" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
OSGi 层次结构
模块层
Bundle 是 OSGi 中的基本组件,其表现形式仍然为 Java 概念中传统的 Jar 包,同时通过 META-INF 目录下的 MANIFEST.MF 文件对其予以进一步的定义。通常一个 MANIFEST.MF 文件的内容如下所示:
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Util Bundle-SymbolicName : com.ibm.director.la.util Bundle-Version : 1.0.0.qualifier Bundle-Activator : com.ibm.director.la.util.Activator Bundle-Vendor : IBM Bundle-RequiredExecutionEnvironment : JavaSE-1.6 Import-Package : org.osgi.framework;version="1.3.0" Bundle-ActivationPolicy : lazy Export-Package : com.ibm.director.la.util;uses:="org.osgi.framework" Bundle-ClassPath : libs/jfreechart-1.0.13-swt.jar, libs/jfreechart-1.0.13.jar, libs/jfreechart-1.0.13-experimental.jar |
MANIFEST.MF 文件示例
也就是说,MANIFEST.MF文件存储的实际上是 Bundle的元数据,元数据的内容能够精确的定义 Bundle的各种特征,同时能够更好的对 Bundle进行标识同时帮组用户的对 Bundle进行理解。例如,通过配置 Import-Package可以指明当前 Bundle 需要哪些其他的包,而通过配置Export-Package则可以表示当前 Bundle 的哪些package对外部可见。不难理解,通过这种方式可以有效的对 Bundle 内部和外部进行隔离。其他更多配置请参考相关资料。
Bundle可以被动态地安装、启动、停止和卸载。
Bundle是服务(Service)和组件(Component)的载体。
在OSGi中,每个Bundle都有自己独立于其他Bundle的ClassLoader,正因为这样,各个Bundle内部的类是隔离的。
Bundle之间的交互方式:
1.通过Package的Export(对外暴露自己的一个或多个package)和Import(导入别人的一个或多个package)来进行。
2.通过Service的方式进行。一个Bundle作为Service提供方,对外提供Servcie .使用者可以查找到提供的Service. 并使用这个Serv?ce. 而提供/使用Service又存在两种方式:一种是经典的做法,通过BundlcContext ( Bundle 的上下文)来提供和获取.一种是使用Declarative Service来实现.
生命周期层
Bundle的生命周期被OSGi框架所管理,具有如下几个状态:INSTALLED 、RESOLVED 、UNINSTALLED 、STARTING、ACTIVE、STOPPING.状态之间的转换关系如下图:
<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" style=‘width:413.25pt;height:287.25pt‘> <v:imagedata src="file:///C:\Users\itway\AppData\Local\Temp\msohtmlclip1\01\clip_image002.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
Bundle状态转换关系图
服务层
一个OSGi Service就是注册到OSGi框架中的一个Java对象。这注册的时候可以设置这个Service的属性。而在获取Service的进候可以根据属性进行过虑(Filter),Bundle可以通过Bundle的上下文去注册Service或去查询Service。
<!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style=‘width:364.5pt;height:141pt‘> <v:imagedata src="file:///C:\Users\itway\AppData\Local\Temp\msohtmlclip1\01\clip_image004.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
服务模型示例图
Service-Oriented Component Model (SOCM)
首先来看Component 的慨念.Component和Service 从定义上看差不多,任何-个普通的J ava对象都可以通过配置文件中的定义而变为一个Component.Component对外提供了服务并且可以使用其他Component提供的服务,Component 的生命周期被OSGi 框架所管理.我们可以看到,Component是提供和使用服务的另外一种方式,并且具有生命周期.
SOCM 在字面上的意思就是面向服务的组件模型.在这个模型中.Component是服务的载体,提供对外使用的服务并可能使用外部的服务,而Component存在于Bundle 之中,系统由多个Bundle 组成.
<!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style=‘width:412.5pt;height:230.25pt‘> <v:imagedata src="file:///C:\Users\itway\AppData\Local\Temp\msohtmlclip1\01\clip_image006.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
SOCM示意图
Declarative Service (DS)
Declarative Service (DS)是OSGi Core Framework 的一个标准服务。DS让我们在Bundle中定义Component,通过配置的方式发布服务、获取服务,以帮助我们实现前面提到的SOCM。有了DS,我们就可以按照Component+Service的方式进委系统的设计与开发。