思路
OSGi每个模块都有自己独立的classpath。如何实现这一点呢?是因为OSGi采取了不同的类加载机制:
- OSGi为每个bundle提供一个类加载器,该加载器能够看到bundle Jar文件内部的类和资源;
- 为了让bundle能互相协作,可以基于依赖关系,从一个bundle类加载器委托到另一个bundle类加载器。
Java和J2EE的类加载模型都是层次化的,只能委托给上一层类加载器;
而OSGi类加载模型则是网络图状的,可以在bundle间互相委托。——这样更合理,因为bundle间的依赖关系并不是层次化的。
- 例如bundleA、B都依赖于bundleC,当他们访问bundleC中的类时,就会委托给 bundleC的类加载器,由它来查找类;如果它发现还要依赖bundleE中的类,就会再委托给 bundleE的类加载器。
优点
- 找不到类时的错