我实现了一项功能,我的 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() 以获得正确的封装连接。