Apache Karaf 中的功能、bundle、依赖项、先决条件与需求之间有什么区别?



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

阅读 Karaf 开发人员撰写的文本后我的结论(我猜?

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

  • 依赖关系相同

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

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

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

请填写我。

这是我的一个特征示例.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>

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

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

术语"捆绑"、"依赖"和"需求"属于OSGi核心规范。而"功能"和"先决条件"是Apache Karaf的特定术语。

现在进入您的列表:

问:"先决条件"不允许在 OSGi 容器中没有其他捆绑包(我称之为依赖关系)时启动我的"特殊服务器"捆绑包。

答:首先,请注意,"先决条件"不适用于捆绑依赖项,仅适用于功能依赖项(顺便说一句,您的XSD已经过时了,请查看当前的XSD),是的,它只是依赖项的专用化。为此,文档非常明确:

如果要将先决条件属性添加到从属功能标记,则 它将强制安装和激活依赖的捆绑包 安装实际功能之前的功能。

问:依赖关系相同

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

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

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

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

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

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

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

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

TL;博士

您抱怨文档,但您自己混淆了术语,因此您最终可能会产生错误的假设或期望。但我同意,在某些细节上,卡拉夫的术语可以更好、更直观。

关于您的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. <bundle>标记没有prerequisite属性,也从未有过(请遵守 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>

最新更新