0

我实现了一项功能,我的 osgi 在启动或接收新文件时以编程方式在文件系统上安装表示为 jar 的包。但是,当我收到一个时,它已经在启动过程中安装,它由于冲突而崩溃。有没有办法(我不知道 ID 也不知道名称)在发生冲突时更新而不是以编程方式安装?

BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
Bundle bundle = context.getBundle("file:/Path.jar");

希望有人知道...

4

1 回答 1

0

我在类似的情况下做了什么:

  • 我写了一个 BundleTracker 将每个包保存到 addBundle 中的 Map 并在 removeBudnle 中删除它
  • 当我想以编程方式安装包时,我检查了是否已经存在具有相同符号名称的包,如果存在,我使用 bundle.update(inputStream) 方法而不是使用 bundleContext.install(...)

如果您想允许同一捆绑包的多个版本,您还可以在更新或安装之前检查捆绑包的版本。在这种情况下,如果我会进行更新

  • 新捆绑包的位置相同(如果您在第一次安装时使用正确的路径)
  • 版本是一样的
  • 捆绑包是单例捆绑包(版本不同无关紧要)

如果您关心位置并且它已更改,请使用重新安装包的 bundle.uninstall() 和 bundlecontext.install(...) 而不是 update(inputstream) 。

最后,您应该调用 refresh() 以获得正确的包接线。

于 2013-09-10T19:14:07.263 回答