osgi学习博客收藏

使用场景: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的根本。只有在实现了这种机制的基础上才有可能存在细粒度的包控制,动态加载等特性。

转载于:https://my.oschina.net/luyaolove/blog/733610

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值