gpt4 book ai didi

apache-karaf - Apache Karaf 中的功能、捆绑、依赖、先决条件和要求之间有什么区别?

转载 作者:行者123 更新时间:2023-12-04 19:26:21 26 4
gpt4 key购买 nike

不幸的是,称为 Karaf 的 OSGi 容器实现的文档很差。概念被擦掉,术语之间的关系没有建立。

我在阅读了 Karaf 开发人员撰写的文本后得出的结论(我猜?):

  • 当 OSGi 容器中没有其他包(我称之为依赖项)时,“先决条件”不允许我的“特殊服务器”包启动。
  • 依赖项相同
  • 两者都不会导致 Karaf 自动获取并启动这些依赖项
  • 要求,根据文档https://karaf.apache.org/manual/latest/provisioning , 将导致 Karaf 自动获取并启动这些依赖项/先决条件/要求。
  • 存储库在我的 features.xml 中让开发人员知道从哪里获取依赖项/先决条件/要求,但不会自动添加到 Karaf。

  • 请填写我。

    这是我运行的 features.xml 示例 maven-resources-plugincopy-resources目标使得 ${var} 的插值s 发生。
    <?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>

    最佳答案

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

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

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

    现在到你的 list :

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

    答:首先,请注意“先决条件”不适用于捆绑依赖项,仅适用于功能依赖项(顺便说一句。您的 XSD 已过时,请查看 current XSD ),是的,它只是依赖性。为此,documentation很明确:

    If you will add prerequisite attribute to dependant feature tag then it will force installation and also activation of bundles in dependant feature before installation of actual feature.



    Q: 依赖都一样

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

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

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

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

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

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

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

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

    TL;博士

    您在提示文档,但您自己混淆了术语,因此您可能会得出错误的假设或期望。但我同意,在某些细节上,Karaf 的术语可以更好、更直观。

    关于您的 features.xml :
  • 请将架构更新为 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">
  • 如果你想安装 Apache Camel 和 CXF,你只需安装功能,而不是包,例如:

  •     <feature name="special-server" version="1.0.0" install="auto" resolver="(obr)">
    <feature>camel-blueprint</feature>
    ...
    </feature>
  • 您的声明 <bundle>依赖是完全错误的。您指定了功能,而不是捆绑包。
  • 没有prerequisite <bundle> 的属性标记并且从来没有(请遵守 XSD)
  • <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>

    关于apache-karaf - Apache Karaf 中的功能、捆绑、依赖、先决条件和要求之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55412177/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com