3

我在 2.2.8 版本的 Karaf 上遇到了问题(很可能在早期版本上也是如此)。

我将使用 Karaf 来托管具有动态部署的捆绑包的系统。捆绑包是由用户部署的,我事先无法知道它们是什么。

我希望 BundleActivator.start() 的顺序完全对应于包之间的包依赖关系(导入/导出包的依赖关系),并计划期望在 bundle1 将要启动之前假设 bundle0 将被完全初始化是安全的. 但事实并非如此 - 似乎 BundleActivator.start() 是以“随机”顺序调用的,并且忽略了包之间的包依赖关系。

示例用例,我有 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”后,只需将 jar 从 ./deploy 文件夹移动到 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的交叉帖子

4

1 回答 1

6

在 OSGi 中,bundle 生命周期是installedresolvedstartingstarted

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

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

于 2012-07-20T07:16:20.023 回答