欢迎来到天天文库
浏览记录
ID:15634375
大小:266.44 KB
页数:11页
时间:2018-08-04
《探索 OSGi 框架的组件运行机制.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、探索OSGi框架的组件运行机制级别:初级王珏(juewang@cn.ibm.com),软件工程师,IBM2008年7月24日OSGi框架为基于Java的组件开发提供了一套通用的和标准的解决方案,通过OSGi框架可以轻松实现组件信息的隐藏和共享。本文介绍了OSGi框架中的组件(Bundle)的运行机制,并结合实际示例加以说明,读者可以进一步深入了解OSGi框架的基本原理,并解决实际开发工作中遇到的类似问题。在目前的Java开发平台中,对于组件开发过程,比如打包、部署和验证等,并没有一个统一的标准。正因如此,许多Java项目,例如JBoss和NetBeans,都拥有一套自定义的组件开
2、发规范和框架,但是实际上这些解决方案都是基于为组件分配独立的类加载器(ClassLoader)的思想。OSGi框架为基于Java的组件开发提供了一套通用的和标准的解决方案,并已经成为事实上的工业标准。OSGi组件框架在OSGi框架中,组件被称为Bundle,它是由一些提供Bundle自身功能的资源(如Java类文件、配置文件等)、MANIFEST.MF文件和其它资源文件构成。在运行时环境中,每个Bundle都有一个独立的ClassLoader,Bundle之间通过不同的类加载器和在MANIFEST.MF文件中定义的包约束条件就可以轻松实现包级别的资源隐藏和共享,从而实现基于组件方
3、式的开发和运行。ClassLoader是实现这种运行方式的关键机制,每个Bundle的ClassLoader必须在此Bundle得到正确的解析(Resolving)之后,再由OSGi框架创建。只有当一个Bundle中的所有包约束条件都满足时,它才被正确解析完毕。Bundle解析Bundle的解析是通过分析定义在MANIFEST.MF文件中的元数据(主要定义了包约束条件),查找与包约束条件相匹配的Bundle并建立关联关系的过程。MANIFEST.MF文件中的包约束条件主要是通过Import-Package、DynamicImport-Package、Export-Package和
4、Require-Bundle这四种表达方式来实现。下面简单介绍一下它们:1Import-Package:定义需要导入的包。默认是所有需导入的包必须都能够找到相应的导出Bundle(Exporter),否则解析失败。2Export-Package:定义导出的包。在一个Bundle里面,一个包的导出定义并不意味着相应的包导入定义,而是这些类资源会在Bundle自身的类路径里面查找和加载。1Require-Bundle:定义依赖的Bundle。2DynamicImport-Package:定义需要动态导入的包。这部分定义没有在Bundle解析过程中使用,而是在运行时动态解析并加载共享包
5、。在Bundle得到正确解析后,OSGi框架将会生成此Bundle的依赖关系表。在实际运行过程中,框架就可以通过此关系表找到Bundle依赖的外部ClassLoader,从而实现外部类资源的加载和运行hg。Bundle的关系图可以在OSGi的控制台中通过内部命令"bundle"来查看,如下图所示:图1.Bundle依赖关系表(点击这里查看清晰大图。)Bundle运行Bundle的运行主要依靠于OSGi框架为其创建的类加载器(ClassLoader),加载器负责查找和加载Bundle自身或所依赖的类资源。ClassLoader之间的依赖关系构成了一个有向图,如下图所示:图2.Cla
6、ssLoader依赖关系图Bundle的ClassLoader能加载的所有类的集合构成了Bundle的类空间(ClassSpace)。类空间包含的类资源主要来自于以下几个方面:1父ClassLoader可加载的类集合;2Import-Package定义的依赖的包;3Require-Bundle定义的依赖的Bundle的类集合;4Bundle自身的类集合,通常在Bundle-Classpath中定义;5隶属于Bundle的Fragment类集合。在实际运行环境中,Bundle的ClassLoader根据如下规则去搜索类资源。规则简要介绍如下:6如类资源属于java.*包,则将加载请
7、求委托给父加载器;7如类资源定义在OSGi框架中启动委托列表(org.osgi.framework.bootdelegation)中,则将加载请求委托给父加载器;8如类资源属于在Import-Package中定义的包,则框架通过ClassLoader依赖关系图找到导出此包的Bundle的ClassLoader,并将加载请求委托给此ClassLoader;9如类资源属于在Require-Bundle中定义的Bundle,则框架通过ClassLoader依赖关系图找到此Bundle的
此文档下载收益归作者所有