读书人

OSGI-OSGI体系架构以及Bundle治理

发布时间: 2013-08-01 15:23:18 作者: rapoo

OSGI-OSGI体系架构以及Bundle管理

?Execution Environment:

Bundle 应用所倚赖运行的 Java 执行环境,如 J2SE-1.4、CDC-1.0 等都是可用的执行环境。

Modules:

模块层定义了 Bundle 应用的加载策略。OSGi 框架是一个健壮并且严格定义的类加载模型。在大多数 Java 应用中,通常只有一个单独的 ClassPath,它包含了所有的 Java 类文件和资源文件,OSGi基于Java技术,对于每个实现了 BundleActivator 接口的 Bundle 应用,为它生成一个单独的 ClassLoader,使得 Bundle 应用的组织更加模块化。

Life Cycle:

生命周期层可以动态地对 Bundle 进行安装、启动、停止、升级和卸载等操作。该层基于模块层,提供了一组 API 来控制 Bundle 应用的运行时操作。

Service Registry 和 Services:

OSGi 服务层定义了一个集成在生命周期层中的动态协作模型,是一个发布、动态寻找、绑定的服务模型。一个服务通常是一个 Java 对象实现了特定的服务接口,并且通过服务注册,被绑定到 OSGi 的运行环境中。Bundle 应用可以注册发布服务,动态绑定服务,并且在服务注册状态改变时,可以接受到事件消息等。

Security:

OSGi 的安全管理是基于 Java2 安全体系的,贯穿在 OSGi 平台的所有层中,它能够对部署在 OSGi 运行环境中的 Bundle 应用进行详细的管理控制。

?

Bundle的组成:

?? ? ? ?1、MANIFEST.MF:描述了 bundle 的所有特征,包括名字、输出的类或者包,导入的类或者包,版本号等等。

?????? 2、代码:包括 Activator 类和其它一些接口以及实现,这个和普通的 Java 应用程序没有什么特殊的区别

?? ? ? ?3、资源:当然,一个应用程序不可能没有资源文件,比如图片、properties 文件、XML 文件等等,这些资源可以随 bundle 一起存在,也可以以 fragment bundle 的方式加入

?

OSGI中的Bundle:

Bundle可以通过export的方式向OSGI容器中的其他Bundle公开自己Bundle中的包,包含模型,接口类等。

也可以通过import方式将OSGI容器中其他Bundle导出的包进行引入。

Bundle也可以定义扩展点,也可以实现其他Bundle公布的扩展点。

?

?

MANIFEST.MF

manifest.mf是用于描述Bundle信息的文件,通常位于/META-INF/目录下

?

属性名字含义Bundle-ActivatorBundle 的启动器Bundle-SymbolicName名称,一般使用类似于 JAVA 包路径的名字命名Bundle-Version版本,注意不同版本的同名 bundle 可以同时上线部署Export-Package导出的 package 声明,其它的 bundle 可以直接引用Import-Package导入的 packageEclipse-LazyStart是否只有当被引用了才启动Require-Bundle全依赖的 bundle,不推荐Bundle-ClassPath本 bundle 的 class path,可以包含其它一些资源路径Bundle-RequiredExecutionEnvironment本 bundle 必须的执行环境,例如 jdk 版本声明

?

?Bundle生命周期管理:

?Bundle的状态变迁图:

OSGI-OSGI体系架构以及Bundle治理
状态含义:

?

状态名字含义INSTALLED就是字面意思,表示这个 bundle 已经被成功的安装了RESOLVED很常见的一个状态,表示这个 bundle 已经成功的被解析(即所有依赖的类、资源都找到了),通常出现在启动前或者停止后STARTING字面意思,正在启动,但是还没有返回,所以您的 Activator 不要搞的太复杂ACTIVE活动的,这是我们最希望看到的状态,通常表示这个 bundle 已经启动成功,但是不意味着您的 bundle 提供的服务也是 OK 的STOPPING字面意思,正在停止,还没有返回UNINSTALLED卸载了,状态不能再发生变更了

?

Bundle的运行以来OSGI平台为其提供的Classloader,由classloader负责查找装载该Bundle运行所依赖(Require-Bundle?)和导入(Import-Packag)的包以及该Bundle本身。

?

Bundle的ClassLoader

?

Bundle的Classloader能加载的所有类的集合构成了Bundle的类空间(Class Space)。该类弓箭包含的类资源主要有以下方面:

?

1、父ClassLoader可加载的类集合

2、Import-Package定义的导入的包

3、Require-Bundle定义的依赖的Bundle的类集合;

4、Bundle自身的类集合,通常在Bundle-Classpath中定义

5、属于该Bundle的Fragment类集合。

?

在实际运行环境中,Bundle 的 Class Loader 根据如下规则去搜索类资源。规则简要介绍如下:

?? ?1、如类资源属于 java.* 包,则将加载请求委托给父加载器(所有Bundle都有共同的Parent ClassLoader)

?? ?2、如类资源定义在OSGI框架的启动委托列表(org.osgi.framework.bootdelegation)中,则将加载请求委托给父加载器

?? ?3、如类资源属于在 Import-Package 中定义的包,则框架通过 Class Loader 依赖关系图找到导出此包的 Bundle 的 Class Loader,并将加载请求委托给此 Class Loader ;

?? ?4、如类资源属于在 Require-Bundle 中定义的 Bundle,则框架通过 Class Loader 依赖关系图找到此 Bundle 的 Class Loader,将加载请求委托给此 Class Loader ;

?? ?5、Bundle 搜索自己的类资源 ( 包括 Bundle-Classpath 里面定义的类路径和属于 Bundle 的 Fragment 的类资源);

?? ?6、若类在 DynamicImport-Package 中定义,则开始尝试在运行环境中寻找符合条件的 Bundle 。

如果在经过上面一系列步骤后,仍然没有正确地加载到类资源,则 OSGi 框架会向外抛出类未 发现异常

?

参考:

?? ? ? ?探索OSGI框架的组件运行机制:http://www.ibm.com/developerworks/cn/java/j-lo-osgi/

?? ? ? ?使用Equniox开发OSGI应用程序:http://www.ibm.com/developerworks/cn/education/opensource/os-eclipse-osgi/index.html

??

读书人网 >操作系统

热点推荐