Karaf : uninstall/install API 包的推荐方法,以及如何避免幽灵包解析

Karaf : Recommended way to uninstall/install API's bundle, and how to avoid ghost bundle resolution

在过去的两年里,我在不同的任务中使用 Karaf(2.4.* 和 4.0.*),每次我遇到 API 包的缓存问题时 uninstall/install他们。

让我们想象一下以下场景:

  1. 我安装(1)service-api/1.0.0,导出com.service.api
  2. 我安装 (2) service-core/1.0.0,它导入 com.service.api
  3. 我卸载了service-api/1.0.0.
  4. 我安装了(3)service-api/1.1.0,增加了新的接口。

当我使用 bundle:install -s 安装捆绑包时出现不同的行为,卸载以卸载它们:

  1. -core 并不总是停止。事实上,他使用了缓存版本的服务-api。当我执行 imports -i (2) 时,我什至可以看到 bundle id (1)。做一个 "resolve (2)" 并不能解决问题,只能 "stop (2)" 然后重新开始。

  2. 当我安装service-api/1.1.0时,3中的错误仍然存​​在,我的服务核心再次使用旧的-api。最大的问题是,如果我安装一个新的 service-soap,它将使用包 (3),而 (2) 使用 (1),因此它会在类加载器之间造成冲突。

我无法在 Internet 上找到关于该问题的任何资源,并且我已经尝试了 Equinox 和 Felix,但我没有看到该问题的任何解决方案。 bundle:install 是安装 bundle 的好方法吗?使用 deploy 是更好的解决方案吗?

奖励:在 OSGI 规范中,在释放所有引用之前不应卸载捆绑包,但在 Karaf 中,捆绑包会直接自行卸载。这可能是上述问题的原因吗?

您所看到的符合 OSGi 规范。当您卸载 API 时,所有使用它的包仍将使用它,直到它们再次被解析。 引入此行为是为了避免在运行时发生级联更改。

要使捆绑包拾取或丢失 API,您需要解决捆绑包。最简单的方法是使用 resolve 命令。它解析给定的捆绑包或所有捆绑包。

另一种自动解析捆绑包的方法是始终使用 Apache Karaf 功能安装它们。当您安装/卸载功能时,Karaf 将始终确保重新解析所有可能受影响的包。

要添加到 Christian 的回答中 - 您需要了解 installing/uninstalling 捆绑包的不同方法是如何工作的。不幸的是,似乎没有标准的方法!

例如,如果您从 gogo shell 卸载,它不会重新解析。也就是说,使用已删除捆绑包的捆绑包在重新解析之前仍会表现得好像什么都没发生过。但是,如果您通过 fileinstall 安装然后卸载,它将自动重新解析。正如 Christian 指出的那样,Karaf 功能也是如此。

如您所见here,您所描述的不是 Karaf 特有的问题。