OSGi(Open Service Gateway Initiative)技术是 java 动态化、模块化系统的一系列规范, 其目的在于制定一套开放式标准,以便向局域网及其中的设备提供可管理的服务。一旦在网 络设备上使用了 OSGi 服务平台,就可以在网络上的任何地方管理这些设备上的程序组件的 生命周期,可以在后台对这些组件进行安装、升级或卸载。
OSGi 实现模块化热部署的关键是它自定义的类加载器机制的实现,每一个程序模块(OSGi 中称为 Bundle)都有一个自己的类加载器,当需要更换 Bundle 时,连同类加载器一起换 掉以实现代码的热替换。在 OSGi 环境下,类加载器不再是双亲委派模型推荐的树状结构, 而是进一步发展为更复杂的网状结构。
当收到类加载请求时,OSGi 将按照下面的顺序进行类搜索:
- 将以
java.*
开头的类委派给父类加载器加载 - 否则,将委派列表名单内的类委派给父类加载器加载
- 否则,将 Import 列表中的类,委派给 Export 这个类的 Bundle 的类加载器加载
- 否则,查找当前 Bundle 的 ClassPath,使用自己的类加载器加载
- 否则,查找类是否在自己的 Fragment Bundle 中,如果在则委派给其类加载器加载
- 否则,查找 Dynamic Import 列表的 Bundle,委派给对应 Bundle 的类加载器加载
- 否则,类查找失败
上述查找顺序只有开头两点符合双亲委派模型的原则,其余步骤都属于在平级的类加载器中 进行的。