9.9 OSGi中的类加载器

OSGi是Java平台上的动态模块系统,它为开发人员提供了面向服务和基于组件的运行环境,并提供标准的方式来管理软件的生命周期。OSGi已经被部署在很多产品上,在开源社区也得到了广泛的支持。Eclipse平台是基于OSGi技术来构建的。在OSGi技术的实现中,类加载器扮演了非常重要的作用。

9.9.1 OSGi基本的类加载器机制

OSGi中最基本的组成部分是模块(bundle)。每个模块作为一个独立的组件,完成特定的功能,并对外提供服务。每个模块由Java类和所需的资源文件组成,以jar包的形式出现。每个模块既可以是服务的提供者,又可以是服务的消费者。从服务提供者的角度来说,一个模块中的Java类可以被其他模块使用;从服务消费者的角度来说,一个模块为了完成其功能,可能需要使用其他模块提供的Java类。对于一个模块中包含的Java类来说,一部分Java类作为对外提供的服务,对其他模块是可见的;而另外一部分Java类则作为模块的内部实现,对其他模块是不可见的。每个模块的Java类相当于存在于一个受管理的隔离空间中。对这个隔离空间的管理由OSGi实现中的类加载器来完成。

下面通过3个相互依赖的模块来说明OSGi中类加载器机制的作用。这3个模块的作用是实现并使用一个简单的计算器程序。其中calculator.common模块中包含实现通用功能的Java类,calculator.impl模块中包含计算器程序的具体实现类,calculator.user模块中包含使用计算器程序的Java类。从依赖关系上说,calculator.impl模块依赖于calculator.common, calculator.user模块依赖于calculator.impl。OSGi中每个模块使用清单文件声明自己所依赖的需要导入的来自其他模块的Java包的名称,也可以声明自己提供出来的可供其他模块使用的Java包的名称。代码清单9-16给出了calculator.impl模块的清单文件中与依赖关系相关的部分。

代码清单9-16 OSGi模块的清单文件中与依赖关系相关的部分


Export-Package:com.java7book.calculator.impl

Import-Package:com.java7book.calculator.common


在清单文件中通过Import-Package属性声明了calculator.impl模块需要使用com.java7book.calculator.common包,通过Export-Package属性声明了calculator.impl模块内部的com.java7book.calculator.impl包对其他模块是可见的。在声明了依赖关系之后,calculator.impl模块中的代码可以使用com.java7book.calculator.common包中的Java类。