【问题标题】:Karaf : Recommended way to uninstall/install API's bundle, and how to avoid ghost bundle resolutionKaraf:卸载/安装 API 包的推荐方法,以及如何避免幽灵包解析
【发布时间】:2017-08-25 19:12:07
【问题描述】:

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

让我们想象以下场景:

  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 并不总是停止。实际上,他使用的是 service-api 的缓存版本。当我执行导入 -i (2) 时,我什至可以看到捆绑包 ID (1)。执行“解决 (2)”并不能解决问题,只能“停止 (2)”然后重新启动。

  2. 当我安装 service-api/1.1.0 时,仍然会出现 3 中的错误,并且我的 service-core 再次使用旧的 -api。最大的问题是如果我安装一个新的 service-soap,它将使用 bundle (3),而 (2) 使用 (1),因此它会在类加载器之间产生冲突。

我在互联网上找不到任何关于这件事的资源,我已经尝试过 Equinox & Felix,但我没有看到任何解决该问题的方法。 bundle:install 是安装 bundle 的好方法吗?使用 deploy 是更好的解决方案吗?

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

【问题讨论】:

    标签: java osgi apache-karaf osgi-bundle karaf


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案2】:

    要补充 Christian 的答案 - 您需要了解安装/卸载捆绑包的不同方法是如何工作的。不幸的是,似乎没有标准的方法!

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 2017-11-04
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2019-08-01
      • 2013-09-08
      相关资源
      最近更新 更多