Osgi:从 jar 安装时更新已安装的bundle



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

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

希望有人知道...

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

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

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

  • 新捆绑包的位置相同(如果在首次安装期间使用正确的路径)
  • 版本相同
  • 捆绑包是单例捆绑包(版本是否不同无关紧要)

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

最后,您应该调用 refresh() 以获得正确的封装连接。

最新更新