1

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

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

如果您需要对该问题进行更多详细说明,请告诉我,我将尝试进一步解释该问题。

PS 我正在使用 Equinox OSGi 框架。

4

1 回答 1

2

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

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

于 2012-10-17T06:13:15.640 回答