Apache Karaf中的功能vs捆绑包vs依赖性vs先决条件vs需求之间有什么区别?

时间:2019-03-29 07:10:52

标签: apache-karaf karaf

不幸的是,OSGi容器实现(称为Karaf)的文献资料很少。刷过概念,没有建立术语之间的关系。

阅读Karaf开发人员撰写的文字后得出的结论(我想是吗?):

  • “先决条件”不允许我的“特殊服务器”捆绑软件在OSGi容器中其他捆绑软件(我称为依赖项)不可用时启动。

  • 依赖性相同

  • 这两个都不会导致Karaf自动获取并启动那些依赖项

  • 根据文档https://karaf.apache.org/manual/latest/provisioning
  • 要求将使Karaf自动获取并启动那些依赖项/先决条件/要求。

  • 存储库位于我的features.xml中,供开发人员了解从何处获取依赖项/先决条件/要求,但不会自动添加到Karaf中。

请填写我的姓名。

这是我通过maven-resources-plugin的{​​{1}}目标运行的features.xml的示例,因此发生copy-resources的插值。

${var}

1 个答案:

答案 0 :(得分:3)

Apache Karaf文档基本上扩展了OSGi规范的术语,这意味着假定您已经了解OSGi。

可以说,您提到的不同术语可以在OSGi或Karaf中清楚地找到。

术语“ Bundle”,“ Dependency”和“ Requirement”属于OSGi Core规范。而“功能”和“前提条件”是Apache Karaf专用术语。

现在到您的列表:

问:当OSGi容器中其他捆绑软件(我称为依赖项)不可用时,“先决条件”不允许启动我的“特殊服务器”捆绑软件。

A:首先,请注意,“先决条件”不适用于捆绑包依赖项,仅适用于功能依赖项(顺便说一下,您的XSD已过时,请查看{{3 }}),是的,它只是依赖项的一种特殊化。为此,current XSD非常明确:

  

如果将先决条件属性添加到从属功能标签,则   它将强制安装和激活依赖包   功能,然后再安装实际功能。

问:依赖项相同

A:是和否。由于“先决条件”依存关系仍然只是功能的安装/激活生命周期中行为不同的依存关系,因此它们仍然仅描述依存关系,但行为略有不同。

如果您改为在bundle依赖项中引用special属性,例如<bundle dependency="true">...,则表示如果该捆绑包(如果指定,则使用可接受的版本)在系统中已经可用,将不再安装。

问:这两个都不会导致Karaf自动获取并启动那些依赖项

A:在这两种情况下,Karaf都会根据需要安装从属功能和捆绑软件。启动发生在(具有“必备”功能)之前或安装功能时(除非已禁用该功能)。

问:根据文档,要求将使Karaf自动获取并启动那些依赖项/先决条件/要求。

A::如果您指的是功能“ documentation”,则为是和否。是的,因为解析程序将尝试查找提供要求的其他功能或捆绑包(称为“ requirements”),如果找到了某些功能或捆绑包,则进行安装。如果系统的当前状态已经满足要求,则什么也不会发生,并且可以立即安装该功能。如果找不到捆绑软件或功能部件,则功能部件安装将失败。不,因为它们不会立即启动。启动功能本身时会启动。

问:问:存储库位于我的features.xml中,供开发人员了解从何处获取依赖项/先决条件/要求,但不会自动添加到Karaf。

A :显然没有。您添加存储库,以使Karaf解析器知道在哪里可以找到相关功能(而不是捆绑软件)的定义。如果您的定义不依赖于其他功能,则没有理由添加存储库。 Capability提供了更多详细信息。

TL; DR

您在抱怨文档,但是您自己在混淆术语,可能会导致错误的假设或期望。但是我同意,在某些细节上,Karaf的术语可能会更好,更直观。

关于您的features.xml

  1. 请将该架构更新为v1.3.0
<features 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"
          name="special-server-features">
  1. 如果要安装Apache Camel和CXF,只需安装功能,而不安装捆绑包,例如:
    <feature name="special-server" version="1.0.0" install="auto" resolver="(obr)">
        <feature>camel-blueprint</feature>
        ...
    </feature>
  1. 您对<bundle>依赖项的声明是完全错误的。您指定的是功能,而不是捆绑包。
  2. prerequisite标签没有<bundle>属性,并且从未使用过(请遵守XSD)
  3. <repository>只能在顶层声明,不能在功能内部声明(也违反XSD)

示例功能存储库

根据您的示例,我编译了一个示例功能存储库,其中包括注释,以期使问题更实用:

<?xml version="1.0" encoding="UTF-8"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.4.0 http://karaf.apache.org/xmlns/features/v1.4.0"
    name="special-server-features">

    <!-- Required feature repositories -->
    <!-- We don't need to define this since Apache Camel already does it
    <repository>mvn:org.apache.cxf.karaf/apache-cxf/3.3.1/xml/features</repository>
    -->
    <repository>mvn:org.apache.camel.karaf/apache-camel/3.0.0.M2/xml/features</repository>

    <!-- Special Server -->
    <feature name="special-server" version="1.0.0" install="auto">
        <!--
            Require Java 8 at least.
        -->
        <requirement>osgi.ee;filter:=&quot;(&amp;(osgi.ee=JavaSE)(version&gt;=1.8))&quot;</requirement>

        <!--
            Every <feature> declares a dependency to another feature declaration
            (either available in this <features> repository or an external one.

            The dependency is bascially made up by referencing the "name" of
            another <feature> declaration.

            dependency="true"
                the feature will not be installed if already available

            prerequisite="true"
                the feature will be installed before ours and all bundles will
                be started
        -->
        <feature dependency="true" prerequisite="true">cxf</feature>
        <feature prerequisite="true">camel-core</feature>
        <feature prerequisite="true">camel-cxf</feature>

        <!--
            These features will just be installed as part of installing the
            current feature.
        -->
        <feature>camel-blueprint</feature>
        <feature>camel-jackson</feature>
        <feature>camel-http4</feature>
        <feature>camel-jaxb</feature>
        <feature>camel-jsch</feature>
        <feature>camel-stream</feature>

        <!--
            Every <bundle> declares a dependency to a standard OSGi Bundle using
            a URL including a protocol to uniquely identify the artifact.

            For Apache Karaf the most common protocol is to rely on Maven:
            https://ops4j1.jira.com/wiki/spaces/paxurl/pages/3833866/Mvn+Protocol

            Here, you also need to know that Apache Karaf also provides an
            internal Maven repository which is asked first and contains all
            Bundles that are already installed. This Maven repository usually
            exists at the Karaf installation sub-directory "system".
        -->

        <!--
            This bundle needs to be available, but we certainly don't want to
            "wrap" it again if it is already there.

            See also: https://ops4j1.jira.com/wiki/spaces/paxurl/pages/3833898/Wrap+Protocol
        -->
        <bundle dependency="true">wrap:mvn:org.minidns/minidns-core/0.3.3</bundle>

        <!--
            Now this is our own bundle which requires all of the above to do
            it's work properly.
        -->
        <bundle>mvn:com.mycorp.servers/special-server/1.0.0</bundle>
    </feature>
</features>