在 Apache Karaf 中配置 JAXB - 无法解析 javax.xml.namespace
Provisioning of JAXB in Apache Karaf - fail to resolve javax.xml.namespace
我正在尝试将一个简单的功能部署到品牌 Karaf 4.0.2 中,它带来了一个带有 JAXB 规范的包:
<?xml version="1.0" encoding="UTF-8"?>
<features name="my-feature" xmlns="http://karaf.apache.org/xmlns/features/v1.3.0">
<feature name="my-javaee-api" version="6.0-5" install="auto">
<bundle>mvn:org.apache.geronimo.specs/geronimo-jaxb_2.2_spec/1.0.1</bundle>
</feature>
</features>
失败并显示以下错误消息:
2015-12-22 13:38:07,218 | ERROR | a0a-abc5141ad81f | FeatureDeploymentListener
| 43 - org.apache.karaf.deployer.features - 4.0.2 | Unable to install features
org.osgi.service.resolver.ResolutionException: Unable to resolve root:
missing requirement [root] osgi.identity; osgi.identity=my-javaee-api; type=karaf.feature; version="[6.0.0.5,6.0.0.5]";
filter:="(&(osgi.identity=my-javaee-api)(type=karaf.feature)(version>=6.0.0.5)(version<=6.0.0.5))"
[
caused by: Unable to resolve my-javaee-api/6.0.0.5:
missing requirement [my-javaee-api/6.0.0.5] osgi.identity; osgi.identity=org.apache.geronimo.specs.geronimo-jaxb_2.2_spec;
type=osgi.bundle; version="[1.0.1,1.0.1]"; resolution:=mandatory
[
caused by: Unable to resolve org.apache.geronimo.specs.geronimo-jaxb_2.2_spec/1.0.1:
missing requirement [org.apache.geronimo.specs.geronimo-jaxb_2.2_spec/1.0.1] osgi.wiring.package;
filter:="(&(osgi.wiring.package=javax.xml.namespace)(version>=1.0.0))"
]
]
我想知道它怎么会错过 javax.xml.namespace
因为它是 OSGi-Framework 的一部分。所以我检查了那个包是否真的丢失了:
admin@root()>package:exports | grep javax.xml.namespace
javax.xml.namespace | 0.0.0 | 0 | org.eclipse.osgi
瞧 - 这是问题的根源 - 版本。为了进行比较,我检查了它在 stock karaf 上的外观:
karaf@root()> package:exports | grep javax.xml.namespace
javax.xml.namespace | 0.0.0 | 0 | org.apache.felix.framework
javax.xml.namespace | 1.4.0 | 0 | org.apache.felix.framework
它使用 Felix 并且有一个合适的版本 1.4.0。我的第一个想法是 branded karaf 使用 Equinox 作为默认的 OSGi-Framework 并将其切换到 Felix 将解决这个问题。但是看一下 karaf/etc/config.properties 就否定了这个想法(它看起来完全像 stock):
karaf.framework=felix
karaf.framework.equinox=mvn\:org.eclipse.birt.runtime/org.eclipse.osgi/3.10.2.v20150203-1939
karaf.framework.felix=mvn\:org.apache.felix/org.apache.felix.framework/5.2.0
现在我陷入了僵局,不知道如何解决我的问题。有什么想法吗?
不幸的是,我现在无法联系到品牌 karaf 的人,因为他们已经在圣诞节假期¯\_(ツ)_/¯
OSGi 框架的导出由配置属性 org.osgi.framework.system.packages
和 org.osgi.framework.system.packages.extra
控制。这些在运行时附加以形成 系统包导出 。
似乎在您的 "stock" 版本的 Karaf 中(不确定那是什么意思,但我会使用您的术语)有人将 javax.xml.namespace;version=1.4.0
添加到其中一个配置属性中。如果您能够在其他版本的 Karaf 中执行相同的操作,那么应该可以正常工作。
确保您的自定义分发不会更改 config.properties
。
如果确实确保 org.osgi.framework.system.packages.extra
确实包含 javax.xml.namespace;version=1.4,
的那个版本
通常如果你想覆盖 Karaf 的某些属性,你可以将这些更改放入 custom.properties
我正在尝试将一个简单的功能部署到品牌 Karaf 4.0.2 中,它带来了一个带有 JAXB 规范的包:
<?xml version="1.0" encoding="UTF-8"?>
<features name="my-feature" xmlns="http://karaf.apache.org/xmlns/features/v1.3.0">
<feature name="my-javaee-api" version="6.0-5" install="auto">
<bundle>mvn:org.apache.geronimo.specs/geronimo-jaxb_2.2_spec/1.0.1</bundle>
</feature>
</features>
失败并显示以下错误消息:
2015-12-22 13:38:07,218 | ERROR | a0a-abc5141ad81f | FeatureDeploymentListener
| 43 - org.apache.karaf.deployer.features - 4.0.2 | Unable to install features
org.osgi.service.resolver.ResolutionException: Unable to resolve root:
missing requirement [root] osgi.identity; osgi.identity=my-javaee-api; type=karaf.feature; version="[6.0.0.5,6.0.0.5]";
filter:="(&(osgi.identity=my-javaee-api)(type=karaf.feature)(version>=6.0.0.5)(version<=6.0.0.5))"
[
caused by: Unable to resolve my-javaee-api/6.0.0.5:
missing requirement [my-javaee-api/6.0.0.5] osgi.identity; osgi.identity=org.apache.geronimo.specs.geronimo-jaxb_2.2_spec;
type=osgi.bundle; version="[1.0.1,1.0.1]"; resolution:=mandatory
[
caused by: Unable to resolve org.apache.geronimo.specs.geronimo-jaxb_2.2_spec/1.0.1:
missing requirement [org.apache.geronimo.specs.geronimo-jaxb_2.2_spec/1.0.1] osgi.wiring.package;
filter:="(&(osgi.wiring.package=javax.xml.namespace)(version>=1.0.0))"
]
]
我想知道它怎么会错过 javax.xml.namespace
因为它是 OSGi-Framework 的一部分。所以我检查了那个包是否真的丢失了:
admin@root()>package:exports | grep javax.xml.namespace
javax.xml.namespace | 0.0.0 | 0 | org.eclipse.osgi
瞧 - 这是问题的根源 - 版本。为了进行比较,我检查了它在 stock karaf 上的外观:
karaf@root()> package:exports | grep javax.xml.namespace
javax.xml.namespace | 0.0.0 | 0 | org.apache.felix.framework
javax.xml.namespace | 1.4.0 | 0 | org.apache.felix.framework
它使用 Felix 并且有一个合适的版本 1.4.0。我的第一个想法是 branded karaf 使用 Equinox 作为默认的 OSGi-Framework 并将其切换到 Felix 将解决这个问题。但是看一下 karaf/etc/config.properties 就否定了这个想法(它看起来完全像 stock):
karaf.framework=felix
karaf.framework.equinox=mvn\:org.eclipse.birt.runtime/org.eclipse.osgi/3.10.2.v20150203-1939
karaf.framework.felix=mvn\:org.apache.felix/org.apache.felix.framework/5.2.0
现在我陷入了僵局,不知道如何解决我的问题。有什么想法吗?
不幸的是,我现在无法联系到品牌 karaf 的人,因为他们已经在圣诞节假期¯\_(ツ)_/¯
OSGi 框架的导出由配置属性 org.osgi.framework.system.packages
和 org.osgi.framework.system.packages.extra
控制。这些在运行时附加以形成 系统包导出 。
似乎在您的 "stock" 版本的 Karaf 中(不确定那是什么意思,但我会使用您的术语)有人将 javax.xml.namespace;version=1.4.0
添加到其中一个配置属性中。如果您能够在其他版本的 Karaf 中执行相同的操作,那么应该可以正常工作。
确保您的自定义分发不会更改 config.properties
。
如果确实确保 org.osgi.framework.system.packages.extra
确实包含 javax.xml.namespace;version=1.4,
的那个版本
通常如果你想覆盖 Karaf 的某些属性,你可以将这些更改放入 custom.properties