В чем различия между функциями и пакетами, зависимостями и предварительными условиями против требований в Apache Karaf? - PullRequest
1 голос
/ 29 марта 2019

К сожалению, реализация контейнера OSGi, называемая Karaf, плохо документирована. Концепции закрашены, а связи между терминологией не установлены.

Мои выводы после прочтения текста, созданного разработчиками Karaf (наверное?):

  • «prerequisite» не позволяет запускать мой пакет «special-server», когда другие пакеты (я бы назвал зависимости) недоступны в контейнере OSGi.

  • зависимости такие же

  • оба эти параметра не приводят к автоматическому извлечению Карафа и запуску этих зависимостей

  • требования, в соответствии с документацией https://karaf.apache.org/manual/latest/provisioning, приведут к автоматическому извлечению Karaf и запуску этих зависимостей / предпосылок / требований.

  • репозитории в моем features.xml, чтобы разработчики знали, где можно найти зависимости / предпосылки / требования, но не добавляются автоматически в Karaf.

Пожалуйста, заполните меня.

Вот мой пример файла feature.xml, который я запускаю через цель maven-resources-plugin copy-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>

1 Ответ

3 голосов
/ 31 марта 2019

Документация Apache Karaf в основном расширяет терминологию спецификаций OSGi, что означает, что предполагается, что вы немного знакомы с OSGi.

Говоря о том, что упомянутые вами разные термины могут быть четко найдены вOSGi или Karaf.

Термины " Bundle ", " Dependency " и " Requirement " относятся к спецификации OSGi Core.Принимая во внимание, что «Feature» и «Prerequisite» являются специфическими терминами Apache Karaf.

Теперь к вашему списку:

Q: «prerequisite» не разрешает моему пакету «special-server»запускаться, когда другие пакеты (я бы назвал зависимости) недоступны в контейнере OSGi.

A: Прежде всего, обратите внимание, что «предварительное условие» не применяетсядля объединения зависимостей, только для создания зависимостей (кстати, ваш XSD устарел, взгляните на текущий XSD ), и да, это просто специализация зависимости.Для этого документация является довольно явной:

Если вы добавите обязательный атрибут к тегу зависимой функции, то это приведет к установке и активации пакетов в зависимой функции до установкиАктуальная функция.

Q: зависимости одинаковы

A: Да и нет.Поскольку «обязательные» зависимости по-прежнему являются просто зависимостями с другим поведением для жизненного цикла установки / активации функции, они по-прежнему просто описывают зависимости, но ведут себя немного по-другому.

Если вместо этого вы ссылаетесь на специальный атрибут взависимость пакета, например, <bundle dependency="true">..., то это означает, что если пакет (с учетом допустимой версии, если он указан) уже доступен в системе, он не будет установлен снова.

Q: оба изэто не заставляет Karaf автоматически выбирать и запускать эти зависимости

A: В обоих случаях Karaf устанавливает зависимые функции и пакеты по мере необходимости.Запуск происходит либо раньше (с «обязательными» функциями), либо при установке функций (если вы не отключили это).

В: требования, в соответствии с документацией, заставят Karaf автоматически получить и запустить эти зависимости/prerequisites/requirements.

A: Если вы имеете в виду функцию " требования ", тогда да и нет.Да, потому что распознаватель попытается найти какую-то другую функцию или комплект, который соответствует требованию (это называется " Capability "), и установить его, если он найден.Если текущее состояние системы уже соответствует требованию, ничего не происходит, и функция может быть установлена ​​сразу.Если для этого не найден пакет или функция, установка функции завершится неудачно.Нет, потому что они не будут немедленно начаты.Запуск происходит при запуске самой функции.

В: репозитории находятся в моем файле functions.xml, чтобы разработчики знали, где можно найти зависимости / предварительные требования / требования, но не добавляются автоматически в Karaf.

A: Очевидно, нет.Вы добавляете репозитории, чтобы дать возможность распознавателю Karaf знать, где найти определение зависимых функций, а не пакетов.Если в вашем определении нет зависимостей от других функций, нет смысла добавлять репозиторий. документация предоставляет более подробную информацию.

TL; DR

Вы жалуетесь на документацию, но вы путаете терминологию самостоятельно и тем самымВы можете оказаться в ложных предположениях или ожиданиях.Но я согласен, что в некоторых деталях терминология Карафа могла бы быть лучше и более интуитивно понятна.

Относительно вашего 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">
Если вы хотите установить 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>
...