依赖于包的OSGI包的自然启动顺序是什么(在Karaf下)?

时间:2012-07-20 06:46:47

标签: osgi apache-karaf

我在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

注意:这是http://karaf.922171.n3.nabble.com/What-is-the-natural-start-order-for-dependent-bundle-td4025256.html

的交叉发布

1 个答案:

答案 0 :(得分:5)

在OSGi中,捆绑生命周期为installedresolvedstartingstarted

Import-Package和Export-Package仅在捆绑从installedresolved时受到影响。因此,框架确保您导入包的所有捆绑包在捆绑之前得到解析,但是捆绑包只会进入已解析状态。然后在第二步中调用激活剂。所以你不能假设激活器按照相同的顺序被调用。如果您需要在testlib2可以工作之前进行一些初始化,那么您应该使用OSGi服务。

所以,如果我理解你的情况,那么testlib0定义了一个接口,testlib1实现了它,testlib2想要使用该实现。因此,实现此目的的最佳方法是将impl发布为testlib1中的OSGi服务,并在testlib3中引用此服务。然后,您可以将该服务与ServiceTracker一起使用,或者与蓝图。我有一个小例子,显示了这个:http://www.liquid-reality.de/x/DIBZ。因此,如果您像我的示例中那样处理您的情况,那么蓝图确保仅在服务存在时才启动testlib2的上下文。当服务消失时,它甚至会停止testlib2。