学习OSGI之一

Bundle原来是和传统的Jar包是有区别的,它不只包括了Jar包还包括了其它资源。其中最主要就是头文件(MANIFEST.MF)了,这个文件存储了Bundle的元数据信息,而加载类过程正是靠这个头文件信息。

例如:在Equnix中,我们要安装Bundle A,首先就是要安装Bundle A,其实就是读取A的头文件中的详细信息,然后把元数据放到BundleDescription中,接着就是重要的一步啦。加载,通过读取安装的结果 BundleDescription,框架了解到应该如何从那里(URL)去加载支撑A的Bundle,然后是Bundle B。如果找到Bundle B,那B又在重复A的过程。直到把必须的Bundle都加载完,那Bundle A就已经为启动作好准备,其就处于RESOLVED状态。

上面很粗的说了Bundle的加载过程,那么Bundle的加载过程Class是怎样的呢?其过程共使用了三种加载机制,说白就只有一种-----委派加载。

首先,加载java.*类,有则委派给Parent ClassLoader,否则判断是否属于boot delegation配置,否,则又交回给Parent ClassLoader。也就是说这两步,只使用了一种加载Parent ClassLoader。

接着判断Bundle是否是属于Import或者Require的,如果是,则交由export Bundle去加载,也就是说支撑插件,就交由支撑插件自己来加载。其实也就是说委派给各自的插件加载。因为OSGI定义了每个Bundle都拥有独立的 ClassLoader。

如果还找不到类,就再去找classpath,有两种classPath。Bundle和Fragment的。不过都是通过classPath来搜索类的。

这里还得强调一下,也有可能加载的是属于向外提供的,如果是,会抛出 NoClassDefFoundException。

上面的过程是一个静态加载过程。如果静态加载还没找到,而且还存在动态加载的需要,动态加载,就直接交由支撑插件加载。

各位,指点一下,谢谢。初学者的真心感谢。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值