EBA 前期POC时的case测试得不够充分,当时多个EBA启动是没有问题的,当然这些测试的EBA之间都没有依赖关系。
最近在正式的项目中就到了问题。
问题是这样的,如果有两个EBA A和B,如果B中的bundle依赖A中的bundle,而在启动时如果bundle B比bundle A先启动(这个启动顺序我们没法控制,由系统随机启动),则bundle B中的bundle都无法启动,都是RESOLVED的状态。
这是因为,EBA B中的Bundle启动时默认都是立刻激活,但这个时候它依赖的(package 依赖)Bundle都还没有加载到OSGi container中,自然就只能是RESOLVED状态。
下面是Aires中启动Bundle的code:
if (b.getState() != Bundle.ACTIVE) {
b.start(Bundle.START_ACTIVATION_POLICY);
bundlesWeStarted.add(b);
}
它启动时会参考MANIFEST.MF中设置的Activation Policy,也就是Bundle-ActivationPolicy参数,如果我们将它设成:
Bundle-ActivationPolicy: lazy
则Bundle会延迟加载,在依赖的bundle都加载后才会激活。