【问题标题】:When a bundle is programmatically started, should dependencies also be started?当一个包以编程方式启动时,是否也应该启动依赖项?
【发布时间】:2012-09-20 02:57:09
【问题描述】:

这是场景:

我在 OSGi 容器中安装并启动了捆绑包“BundleA”。新版本的 BundleA 可用。 BundleA 是使用 Felix Bundle Repository 提供的。新版本的 BundleA 对来自“BundleB”的包声明了新的包级别要求。

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

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

然后我再次以编程方式 start() BundleA,并且 BundleA 启动。但是 BundleB 是“已解决”,而不是“活动”。我可以手动启动 BundleB,它按预期工作。

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

【问题讨论】:

    标签: osgi apache-felix obr


    【解决方案1】:

    这是预期的默认行为。

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

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

    【讨论】:

    • 所以,澄清一下,当一个包仅仅被“解析”时,仍然可以从中加载类吗?如果 BundleA 需要调用 BundleB 中的一个类,即使它没有启动,它也能做到吗?
    • 是的。已解析的捆绑包具有与其依赖项的所有连接,并准备好从中加载类。
    【解决方案2】:

    OSGi 框架不会自动启动捆绑软件。 (但是,它将在框架启动时重新启动先前启动的包。)框架对包之间的启动依赖关系一无所知,并且包不应该需要特定的启动顺序。正如 Gunnar 所提到的,您可以使用激活策略来触发延迟激活,但如果您没有在具有延迟激活策略的捆绑包上调用 start,则不会执行任何操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多