最近做的一个项目中遇到了添加外部jar包的问题,用到了osgi的一些东西。转过来一些,加深了解..
转自http://www.iteye.com/topic/1124145
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 —— 服务层主要涉及模块之间的交互和通信。
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来实现.