我在2.2.8版本的Karaf上遇到了问题(很可能也是早期版本)。
我将使用Karaf来使用动态部署的bundle来托管系统。捆绑包由用户部署,我不知道他们是谁。
我希望BundleActivator.start()的顺序与bundle之间的包依赖关系(导入/导出包的依赖关系)完全对应,并计划在bundle1开始之前假设bundle0将被完全初始化是可以安全的。要开始了。但事实并非如此 - 似乎BundleActivator.start()以“随机”顺序调用,并忽略了bundle之间的包依赖关系。
示例用例,我有3个库
test-lib0 - defines testlib0.ITestRoot, exports testlib0 package
test-lib1 - defines testlib1.TestRoot implements ITestRoot, exports testlib1 package
test-lib2 - uses both libs, ITestRoot and TestRoot
当Karaf启动时,我在控制台中看到以下示例输出
karaf@root> TestLib1Activator.start()
TestLib2Activator.start()
ITestRoot: interface com.testorg.testlib0.ITestRoot - 16634462
TestRoot: class com.testorg.testlib1.TestRoot - 21576551
TestLib0Activator.start()
但我希望它应该始终按此顺序
TestLib0Activator.start()
TestLib1Activator.start()
TestLib2Activator.start()
ITestRoot: interface com.testorg.testlib0.ITestRoot - 16634462
TestRoot: class com.testorg.testlib1.TestRoot - 21576551
我正在附加示例项目以进行测试。测试用例:在“mvn install”之后只需将./deploy文件夹中的jar移动到Karaf的同一文件夹中,跟踪消息应该出现在控制台中。 (注意:从第一次尝试开始它可以正常工作,再试一次:))
示例测试项目 http://karaf.922171.n3.nabble.com/file/n4025256/KarafTest.zip
的交叉发布答案 0 :(得分:5)
在OSGi中,捆绑生命周期为installed
→resolved
→starting
→started
。
Import-Package和Export-Package仅在捆绑从installed
到resolved
时受到影响。因此,框架确保您导入包的所有捆绑包在捆绑之前得到解析,但是捆绑包只会进入已解析状态。然后在第二步中调用激活剂。所以你不能假设激活器按照相同的顺序被调用。如果您需要在testlib2可以工作之前进行一些初始化,那么您应该使用OSGi服务。
所以,如果我理解你的情况,那么testlib0定义了一个接口,testlib1实现了它,testlib2想要使用该实现。因此,实现此目的的最佳方法是将impl发布为testlib1中的OSGi服务,并在testlib3中引用此服务。然后,您可以将该服务与ServiceTracker一起使用,或者与蓝图。我有一个小例子,显示了这个:http://www.liquid-reality.de/x/DIBZ。因此,如果您像我的示例中那样处理您的情况,那么蓝图确保仅在服务存在时才启动testlib2的上下文。当服务消失时,它甚至会停止testlib2。