java - Karaf : Recommended way to uninstall/install API's bundle, 以及如何避免重影捆绑解析

标签 java osgi apache-karaf osgi-bundle karaf

过去两年我在不同的任务中使用 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,它添加了新接口(interface)。

当我使用bundle:install -s来安装 bundle ,使用uninstall来卸载它们时,会发生不同的行为:

  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 的好方法吗?使用部署是更好的解决方案吗?

奖励:在 OSGI 规范中,在所有引用都发布之前不应卸载 bundle ,但在 Karaf 中, bundle 会直接卸载自身。这可能是导致上述问题的原因吗?

最佳答案

您所看到的符合 OSGi 规范。当您卸载 API 时,使用它的所有 bundle 仍将使用它,直到再次解决为止。 引入此行为是为了避免运行时中的级联更改。

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

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

关于java - Karaf : Recommended way to uninstall/install API's bundle, 以及如何避免重影捆绑解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43141945/

相关文章:

java - NetBeans7.2 中 ArrayList 的问题

Java动画周期 Action

java - Libgdx 3d 上的 fps 低

java - 尝试导出简单接口(interface)时 Unresolved 约束

cxf - 您如何调试 CXF 端点发布?

java - 为 hazelcast 创建自定义发现策略时出现问题

java - 圆角按钮不起作用

java - OSGi DB 访问的高级架构布局是什么?

java - Java 8 模块与 OSGi 有何不同?

java - 在 OSGi 包中使用 Spring AOP