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。
上面的过程是一个静态加载过程。如果静态加载还没找到,而且还存在动态加载的需要,动态加载,就直接交由支撑插件加载。
各位,指点一下,谢谢。初学者的真心感谢。
例如:在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。
上面的过程是一个静态加载过程。如果静态加载还没找到,而且还存在动态加载的需要,动态加载,就直接交由支撑插件加载。
各位,指点一下,谢谢。初学者的真心感谢。