我正在实现一个包含三个bundle的GUI(swing)应用程序,比如bundleA,bundleB和bundleC。我使用BundleContext.installBundle(String location)方法在/使用单独的安装程序包安装所有这三个软件包。
当我使用另一个名为“UpgradeBundle”的软件包更新三个已安装的软件包之一时,问题就出现了。更确切地说,我调用BundleC.update(null)方法,然后调用FrameworkWiring.refreshBundles(BundlesForRefresh,null)方法,因为我读到bundle更新需要调用FrameworkWiring.refreshBundles。但是,对FrameworkWiring.refreshBundles的调用导致启动带有更新bundle的新GUI应用程序(而不是在已经运行的应用程序实例中更新它),而已经运行的应用程序继续使用旧bundle运行。知道为什么会这样吗?
如果您需要更详细地说明问题,请告诉我,我会尝试进一步解释这个问题。
P.S。我正在使用Equinox OSGi框架。
答案 0 :(得分:2)
刷新将停止所有引用任何先前版本的更新捆绑包的捆绑包。我猜你的应用程序在调用stop方法时没有正确关闭现有实例。然后start方法创建一个新方法。
为防止应用在更新时不关闭,您必须仔细设计系统,以确保应用中没有类加载器引用到更新的包。服务,专注于接口,是实现这一目标的绝佳方式。但是,最终会出现许多情况,您的应用程序也需要关闭以刷新其引用。