【问题标题】:OSGi bundle update does not stops/unloads old bundle, why?OSGi 包更新不会停止/卸载旧包,为什么?
【发布时间】:2012-10-07 03:29:11
【问题描述】:

我正在实现一个 GUI (swing) 应用程序,它包含三个包,比如说 bundleA、bundleB 和 bundleC。我使用 BundleContext.installBundle(String location) 方法将所有这三个包安装在/使用单独的安装包中。

当我使用另一个名为“UpgradeBundle”的包来更新三个已安装的包之一时,问题就开始了。更准确地说,我调用 BundleC.update(null) 方法,然后调用 FrameworkWiring.refreshBundles(BundlesForRefresh, null) 方法,因为我读到包更新需要调用 FrameworkWiring.refreshBundles。然而,对 FrameworkWiring.refreshBundles 的调用会导致启动一个带有更新包的新 GUI 应用程序(而不是在已经运行的应用程序实例中更新它),而已经运行的应用程序继续使用旧包运行。知道为什么会这样吗?

如果您需要更详细地说明问题,请告诉我,我会尝试进一步解释问题。

附:我正在使用 Equinox OSGi 框架。

【问题讨论】:

    标签: osgi bundle auto-update


    【解决方案1】:

    Refresh 将停止所有引用任何先前版本的更新包的包。我猜你的应用程序在调用 stop 方法时没有正确关闭现有实例。 start 方法然后创建一个新的。

    为防止应用在更新时不关闭,您必须仔细设计您的系统,以确保您的应用中没有类加载器引用到更新的捆绑包。专注于接口的服务是实现这一目标的绝佳方式。但是,最终会有很多情况下,您的应用还需要关闭以刷新其引用。

    【讨论】:

    • 亲爱的@Peter 非常感谢您的回复。是的,我意识到我的应用程序在捆绑生命周期管理方面设计得很糟糕。我会深入研究这个。此外,我意识到我试图更新的 bundleC 实际上是一个片段(它有助于 bundleA 并且没有自己的激活器)。这让我想到另一个问题,更新捆绑包和更新片段之间有什么显着区别吗?
    猜你喜欢
    • 2013-03-16
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2013-12-22
    相关资源
    最近更新 更多