不幸的是,OSGi容器实现(称为Karaf )的文档很少。概念被忽略,术语之间的关系也没有建立起来。
我在阅读了Karaf开发人员编写的文本后得出的结论(我猜?):
features.xml中,供开发人员知道在哪里获得依赖/先决条件/需求,但不会自动添加到Karaf中。请告诉我。
下面是我的一个features.xml示例,我运行了maven-resources-plugin的copy-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>发布于 2019-03-31 11:52:58
Apache文档基本上扩展了OSGi规范的术语,这意味着假定您对OSGi有一定的了解。
说到这一点,您提到的不同术语可以清楚地位于OSGi或Karaf中。
术语"捆绑“、"依赖性”和"要求“属于OSGi核心规范。而“特性”和“先决条件”是Apache特定的术语。
现在看你的名单:
Q:“前提条件”不允许在OSGi容器中其他包(我将调用依赖项)不可用时启动“特殊服务器”包。
A:首先,请注意,“先决条件”不适用于包依赖,只适用于特性依赖(顺便说一句)。您的XSD已经过时了,请看一下电流XSD),是的,它只是一个依赖项的专门化。因此,文档是非常明确的:
如果要向依赖特性标签添加先决条件属性,那么在实际特性安装之前,它将强制安装并激活依赖特性中的捆绑包。
Q:依赖项是相同的
A:是和不是。由于“先决条件”依赖仍然只是一个特性的安装/激活生命周期的不同行为的依赖关系,它们仍然只是描述依赖关系,但行为略有不同。
如果您转而引用包依赖项(例如<bundle dependency="true">... )中的特殊属性,那么这意味着如果包(如果指定的话尊重可接受的版本)已经在系统中可用,那么它将不再安装。
Q:这两种情况都不会导致Karaf自动获取和启动那些依赖项
A:在这两种情况下,Karaf都会根据需要安装依赖特性和包。启动发生在前面(带有“先决条件”特性)或在功能安装(除非您已经禁用)。
dependencies/prerequisites/requirements. Q:根据文档,需求将导致自动获取和启动
A:,如果你指的是特征"要求",那么是和否。是的,因为解析器将尝试找到提供需求的其他特性或包(这称为"能力"),并在找到需求时安装它。如果系统的当前状态已经提供了该需求,则不会发生任何事情,并且可以立即安装该功能。如果找不到相应的包或特性,则功能安装将失败。不,因为他们不会马上启动。当特性本身启动时,启动会发生。
Q:库在我的features.xml中,供开发人员知道在哪里获得依赖关系/先决条件/需求,但不会自动添加到Karaf.中。
A:显然不是。您可以添加存储库,让Karaf解析器知道在哪里可以找到依赖特性的定义,而不是包。如果定义中的其他特性没有依赖项,则没有理由添加存储库。文档提供了更多细节。
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"> <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:="(&(osgi.ee=JavaSE)(version>=1.8))"</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>https://stackoverflow.com/questions/55412177
复制相似问题