8.4. 如何跟踪缺失的依赖项

要跟踪缺少的依赖项,请执行以下步骤:

  1. 使用 bundle:diag console 命令。这将提供有关为什么您的捆绑包不活跃的信息。有关使用信息,请参阅 Apache Karaf 控制台参考
  2. 执行快速检查,以确保在 OSGi 容器中真正安装所有必需的捆绑包和功能。您可以使用 bundle:list 来检查已安装的哪些捆绑包,以及 features:list 检查是否已安装哪些功能。
  3. 使用 bundle:install console 命令安装(但不启动)您的捆绑包。例如:

    karaf@root()> bundle:install MyBundleURL
  4. 使用 bundle:dynamic-import console 命令,在刚安装的捆绑包上启用动态导入。例如,如果捆绑包的捆绑包 ID 是 218,您可以通过输入以下命令在该捆绑包上启用动态导入:

    karaf@root()> bundle:dynamic-import 218

    此设置允许使用容器中已安装的 任何 捆绑包(基于 Import-Package 标头)来解析依赖项。这不会 记住用于正常部署,因为它会绕过版本检查:您可以轻松地获取错误的软件包版本,从而导致应用程序出现故障。

  5. 现在,您应该能够解析您的捆绑包。例如,如果您的捆绑包 ID 是 218,请输入 followng console 命令:

    karaf@root()> bundle:resolve 218
  6. 假设您的捆绑包现已解决(使用 bundle:list检查捆绑包状态),您可以使用 package:imports 命令获取所有软件包的完整列表。例如,如果您的捆绑包 ID 是 218,请输入以下命令:

    karaf@root()> package:imports -b 218

    您应该在控制台窗口中看到一个依赖软件包列表:

    Package                              │ Version       │ Optional   │ ID  │ Bundle Name
    ─────────────────────────────────────┼───────────────┼────────────┼─────┼──────────────────────────────────
    org.apache.jasper.servlet            │ [2.2.0,3.0.0) │ resolved   │ 217 │ org.ops4j.pax.web.pax-web-runtime
    org.jasypt.encryption.pbe            │               │ resolved   │ 217 │ org.ops4j.pax.web.pax-web-runtime
    org.ops4j.pax.web.jsp                │ [7.0.0,)      │ resolved   │ 217 │ org.ops4j.pax.web.pax-web-runtime
    org.ops4j.pax.web.service.spi.model  │ [7.0.0,)      │            │ 217 │ org.ops4j.pax.web.pax-web-runtime
    org.ops4j.pax.web.service.spi.util   │ [7.0.0,)      │            │ 217 │ org.ops4j.pax.web.pax-web-runtime
    ...
  7. 解包您的捆绑包 JAR 文件,并查看 META-INF/MANIFEST.MF 文件中 Import-Package 标头中列出的软件包。将这个列表与上一步中找到的软件包列表进行比较。现在,编译清单中 Import-Package 标头中缺少的软件包列表,并将这些软件包名称添加到项目的 POM 文件的 Maven 捆绑插件配置的 Import-Package 元素中。
  8. 要取消动态导入选项,您必须从 OSGi 容器中卸载旧的捆绑包。例如,如果您的捆绑包 ID 是 218,请输入以下命令:

    karaf@root()> bundle:uninstall 218
  9. 现在,您可以使用导入的软件包的更新列表重建捆绑包,并在 OSGi 容器中进行测试。

addurl :experimental: :toc: :toclevels: 4 :numbered: