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

Jon*_*mar 5 apache-karaf karaf

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

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

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

  • 依赖项是相同的

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

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

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

请填写我。

这里是我的,我跑通过features.xml的例子maven-resources-plugincopy-resources这样的插值目标${var}小号出现。

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

    <!-- Special Server -->
    <feature name="special-server" version="1.0.0" install="auto" resolver="(obr)">

        <details>
            A feature is just a group of bundles that should all be installed together.
            When an OSGi container adds a bundle, it goes through a resolution process
            to make sure that the bundle’s dependencies are met (and that it does not
            conflict with other installed bundles). However, that resolution process
            does not include any ability to obtain any dependencies; it just checks to
            see if they are available and delays or prevents the bundle from starting
            if a required dependency is missing.

            Requirements can tell the feature resolver to
            automatically install the bundles to satisfy the requirements.

            Dependencies vs. prerequisites:
        </details>



        <!-- Required feature repositories (containing all bundles) -->
        <repository>mvn:org.apache.camel.karaf/apache-camel/${camel.version}/xml/features</repository>
        <repository>mvn:org.apache.cxf.karaf/apache-cxf/${camel.version}/xml/features</repository>

        <bundle version="${camel.version}" prerequisite="true">camel-core</bundle>
        <bundle version="${camel.version}" prerequisite="true">cxf</bundle>
        <bundle version="${camel.version}" prerequisite="true">camel-blueprint</bundle>
        <bundle version="${camel.version}" prerequisite="true">camel-jackson</bundle>
        <bundle version="${camel.version}" prerequisite="true">camel-cxf</bundle>
        <bundle version="${camel.version}" prerequisite="true">camel-http</bundle>
        <bundle version="${camel.version}" prerequisite="true">camel-jaxb</bundle>
        <bundle version="${camel.version}" prerequisite="true">camel-jsch</bundle>
        <bundle version="${camel.version}" prerequisite="true">camel-log</bundle>
        <bundle version="${camel.version}" prerequisite="true">camel-stream</bundle>
    </feature>

</features>
Run Code Online (Sandbox Code Playgroud)

Anc*_*ron 7

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

说到这里,您提到的不同术语在 OSGi 或 Karaf 中都可以清楚地定位。

术语“ Bundle ”、“ Dependency ”和“ Requirement ”属于 OSGi Core 规范。而“功能”和“先决条件”是 Apache Karaf 的特定术语。

现在到你的清单:

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

A:首先,请注意“先决条件”不适用于 bundle 依赖,只适用于特性依赖(顺便说一句,你的 XSD 已经过时了,看看当前的 XSD),是的,它只是一个专业化一种依赖。为此,文档非常明确:

如果您将先决条件属性添加到依赖功能标签,那么它将在安装实际功能之前强制安装并激活依赖功能中的包。

问:依赖是一样的

答:有也没有。由于“先决条件”依赖项仍然只是在功能的安装/激活生命周期中具有不同行为的依赖项,因此它们仍然只是描述依赖项,但行为略有不同。

如果您在捆绑依赖项中引用特殊属性,例如<bundle dependency="true">...,那么这意味着如果捆绑包(如果指定了可接受的版本)在系统中已经可用,则不会再次安装它。

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

答:在这两种情况下,Karaf 都会根据需要安装相关功能和捆绑包。启动发生在之前(具有“先决条件”功能)或在功能安装时(除非您已禁用)。

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

答:如果您指的是功能“要求”,那么是和否。是的,因为解析器会尝试找到提供需求的其他功能或捆绑包(这称为“功能”),如果找到了,则安装它。如果系统的当前状态已经提供了要求,则不会发生任何事情并且可以立即安装该功能。如果找不到捆绑包或功能,则功能安装将失败。不,因为它们不会立即启动。启动发生在功能本身启动时。

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

答:显然没有。您添加存储库以让 Karaf 解析器知道在哪里可以找到依赖功能的定义,而不是包。如果您的定义中没有对其他功能的依赖,则没有理由添加存储库。该文档提供了更多详细信息。

TL; 博士

您在抱怨文档,但您自己混淆了术语,因此您可能会得出错误的假设或期望。但我同意,在某些细节上,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">
Run Code Online (Sandbox Code Playgroud)
  1. 如果您想安装 Apache Camel 和 CXF,您只需安装功能,而不是捆绑包,例如:
    <feature name="special-server" version="1.0.0" install="auto" resolver="(obr)">
        <feature>camel-blueprint</feature>
        ...
    </feature>
Run Code Online (Sandbox Code Playgroud)
  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>
Run Code Online (Sandbox Code Playgroud)