使用场景:http://www.blogjava.net/BlueDavy/archive/2009/04/29/268227.html
动态化介绍:http://www.blogjava.net/BlueDavy/archive/2009/04/29/268227.html
在Spring DM中使用Annotations发布和引用服务 : http://blog.youkuaiyun.com/jacktan/article/details/7170380
Spring DM文档:http://docs.spring.io/osgi/docs/1.0/api/overview-summary.html
osgi 文档:https://osgi.org/javadoc/r6/core/index.html
介绍文档:http://osgi.com.cn/article/7289374#
一、概述:
OSGi中最重要的组成单元就是Bundle,说简单点Bundle就是一个将Java类文件、配置文件、MANIFEST.MF文件以及其他一些资源文件打包起来的Jar文件,它与普通Jar的区别就是Bundle中的MANIFEST.MF文件中包含了特殊的OSGi元数据定义,这样OSGi容器才能识别出是否是合法的Bundle。在运行时环境中,每个 Bundle 都有一个独立的 Classloader,Bundle 之间通过不同的类加载器和在 MANIFEST.MF 文件中定义的元数据来实现包级别的依赖关系控制。 隔离的Classloader 是实现这种运行方式的关键机制,每个 Bundle 的 Class Loader 必须在此 Bundle的所有依赖关系得到正确解析之后,再由 OSGi 框架创建。
二、 Bundle 解析
当Bundle 得到正确解析后,OSGi 容器将会生成所有Bundle之间 的依赖关系表。在实际运行过程中,容器就可以通过此依赖关系表找到 Bundle 依赖的外部 Class Loader,从而实现外部类资源的加载和运行。 某个Bundle 的依赖关系图可以通过在 OSGi 的控制台中输入内部命令“bundle {id}”来查看,其中{id}为某个Bundle的ID号,可通过“ss”命令查看所有运行在OSGi容器中Bundle的ID号
三、Bundle的运行加载
Bundle 的运行主要依靠OSGi 容器为其创建的类加载器(Class Loader),加载器负责查找和加载 Bundle 自身的或依赖的类资源。 ClassLoader 之间的依赖关系构成了一个有向图,如下图所示:
Bundle 的 Class Loader 能加载的所有类的集合称为 Bundle 的类空间。Bundle的类空间由以下5部分组成:
a) 父Class Loader 可加载的类集合;
b) 由Import-Package定义的依赖的包;
c) Require-Bundle 定义的依赖的 Bundle 的类集合;
d) Bundle 自身的类集合,通常在 Bundle-Classpath 中定义;
e) 隶属于Bundle 的 Fragment 类集合;
Bundle 的 Class Loader 是根据什么规则来搜索类资源的:
a) 如类资源属于 java.* 包,则将加载请求委托给父加载器,图中的Parent/System classloader;
b) 如类资源定义在 OSGi容器中启动委托列表(org.osgi.framework.bootdelegation)中,则将加载请求委托给父加载器,图中的System Bundle class loader;
c) 如类资源属于在 Import-Package 中定义的包,则将加载请求委托给导出此包的Bundle的Class Loader;
d) 如类资源属于在 Require-Bundle 中定义的 Bundle,则将加载请求委托给该Bundle的Class Loader;
e) Bundle 搜索自己的类资源 ( 包括Bundle-Classpath 里面定义的类路径和属于 Bundle 的 Fragment 的类资源);
f ) 若类在DynamicImport-Package 中定义,则开始尝试在运行环境中寻找符合条件的 Bundle 。
如果在上述的每个步骤中没有正确的加载到指定的类资源,则OSGi容器会抛出NoClassDefFoundException或ClassNotFoundException异常。这2个异常是OSGi环境下开发最容易遇到的问题,因此一旦遇到此问题就应该按照上述步骤检查每个Bundle是否正确导出了被其他Bundle引入的包或是正确引入了其他Bundel导出的包。
OSGi 核心理论就是Classloader的隔离,这是OSGi的根本。只有在实现了这种机制的基础上才有可能存在细粒度的包控制,动态加载等特性。