在Apache Karaf中配置JAXB - 无法解析javax.xml.namespace

时间:2015-12-22 12:58:42

标签: osgi apache-karaf

我正在尝试将一个简单的功能部署到品牌 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。我的第一个想法是品牌 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打上烙印的人,因为他们已经在圣诞假期¯\ _(ツ)_ /¯

2 个答案:

答案 0 :(得分:0)

OSGi Framework的导出由配置属性org.osgi.framework.system.packagesorg.osgi.framework.system.packages.extra控制。这些附加在运行时以形成系统包导出

似乎在您的“股票”版本的Karaf(不确定这意味着什么,但我只会使用您的术语)有人已将javax.xml.namespace;version=1.4.0添加到其中一个配置属性中。如果你能够在其他版本的Karaf中做同样的事情,那么事情应该有效。

答案 1 :(得分:0)

确保您的自定义发布不会更改config.properties。 如果它确实确保 org.osgi.framework.system.packages.extra 确实包含javax.xml.namespace;version=1.4,的那个版本 通常,如果要覆盖Karaf的某些属性,可以将这些更改放入custom.properties