Apache Karaf 功能先决条件

Apache Karaf feature prerequisite

卡拉夫 4.0.3

我有以下伪特征:

<features name="my-feature" xmlns="http://karaf.apache.org/xmlns/features/v1.3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                           xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.3.0 http://karaf.apache.org/xmlns/features/v1.3.0">
<feature name="C" version="${project.version}" start-level="25" install="auto">
    <bundle start-level="25">...BundleC1...</bundle>
</feature>

<feature name="A" version="${project.version}" start-level="30" install="auto">
    <feature prerequisite="true">C</feature>
    <bundle start-level="30">...BundleA1...</bundle>
</feature>

<feature name="B" version="${project.version}" start-level="35" install="auto">
    <feature prerequisite="true">C</feature>
    <bundle start-level="35">...BundleB1...</bundle>
</feature>

C独立
A依赖于C
B依赖于C

在这个例子中,包 'BundleB1' 导入了错误的 'BundleC1' 主版本,我们得到了 "missing requirement" 错误(正如预期的那样)。但是,如果我登录到 karaf 控制台并 运行 'feature:list' 我将看到 C 已启动,A 已卸载,B 已卸载。

我希望 A 能够启动,因为它只依赖于 C。如果我注释掉整个 C 功能或者如果我随后 运行 feature:install A

,A 将正常启动

如果我将这三个功能中的每一个都放在单独的 feature.xml 文件中,我会得到 C+A 作为已启动和 B 作为卸载的预期结果。

我做错了什么?

我是否误解了先决条件属性的工作原理?作为旁注,如果我一起跳过先决条件属性,那么无论如何都不会安装任何功能...

这是 Karaf 4 中的预期行为:Karaf 创建了一个子系统,其中包含要安装的所有功能。这个子系统一次性解决:要么成功要么失败,作为一个整体。

prerequisite 属性告诉 Karaf 在独立子系统中安装此功能:在尝试解析其他功能之前安装并启动所有包。

你的情况:

  • C 是 installed/started ;
  • A+B 已解决,但失败