以下是该方案:
我安装了捆绑包'BundleA'并在OSGi容器中启动。 BundleA的新版本可用。 BundleA使用Felix Bundle Repository进行配置。新版本的BundleA在'BundleB'上声明了对包的新包级别要求。
在我更新BundleA之前(使用OBR的deploy())我停止了BundleA,因为我希望所有线程都停止运行,并且去激活器提供这种能力。
当我在BundleA上执行deploy()时,也会按预期安装BundleB。
然后我再以编程方式启动()BundleA,然后BundleA启动。但是BundleB是'已经解决',而不是'活跃'。我可以手动启动BundleB,它按预期工作。
这是预期的,与我以编程方式调用OSGi API的方式有关,还是出了问题?
答案 0 :(得分:2)
这是预期的默认行为。
只要加载了包中的任何类,就可以启用自动激活包。为此,您需要设置Bundle-ActivationPolicy: lazy
标题。
在Eclipse中,在概述页面的Manifest编辑器中,复选框“在加载其中一个类时激活此插件”。
答案 1 :(得分:2)
OSGi框架不会自动启动捆绑包。 (然而,它将在框架启动时重新启动先前启动的bundle。)框架不知道有关bundle和bundle之间的启动依赖关系的任何信息不应该需要某个启动顺序。正如Gunnar所提到的,您可以使用激活策略来触发延迟激活,但如果您没有使用延迟激活策略在捆绑包上调用start,则无法执行任何操作。