以编程方式启动bundle时,是否还应启动依赖项?

时间:2012-09-28 08:29:01

标签: osgi apache-felix obr

以下是该方案:

我安装了捆绑包'BundleA'并在OSGi容器中启动。 BundleA的新版本可用。 BundleA使用Felix Bundle Repository进行配置。新版本的BundleA在'BundleB'上声明了对包的新包级别要求。

在我更新BundleA之前(使用OBR的deploy())我停止了BundleA,因为我希望所有线程都停止运行,并且去激活器提供这种能力。

当我在BundleA上执行deploy()时,也会按预期安装BundleB。

然后我再以编程方式启动()BundleA,然后BundleA启动。但是BundleB是'已经解决',而不是'活跃'。我可以手动启动BundleB,它按预期工作。

这是预期的,与我以编程方式调用OSGi API的方式有关,还是出了问题?

2 个答案:

答案 0 :(得分:2)

这是预期的默认行为。

只要加载了包中的任何类,就可以启用自动激活包。为此,您需要设置Bundle-ActivationPolicy: lazy标题。

在Eclipse中,在概述页面的Manifest编辑器中,复选框“在加载其中一个类时激活此插件”

答案 1 :(得分:2)

OSGi框架不会自动启动捆绑包。 (然而,它将在框架启动时重新启动先前启动的bundle。)框架不知道有关bundle和bundle之间的启动依赖关系的任何信息不应该需要某个启动顺序。正如Gunnar所提到的,您可以使用激活策略来触发延迟激活,但如果您没有使用延迟激活策略在捆绑包上调用start,则无法执行任何操作。