【问题标题】:using cxf in osgi: Provider org.apache.cxf.jaxws.spi.ProviderImpl not found在 osgi 中使用 cxf:未找到提供程序 org.apache.cxf.jaxws.spi.ProviderImpl
【发布时间】:2012-06-26 13:35:54
【问题描述】:

我正在尝试发布一些 Web 服务(使用 EndpointImpl.publish()),但出现此错误:

未找到提供程序 org.apache.cxf.jaxws.spi.ProviderImpl

cxf-bundle 已安装:

[  79] [Active   ] [Created  ] [   50] Apache CXF Bundle Jar (2.4.3.fuse-01-02)

osgi:headers 的摘录显示了导入的包

Import-Package = 
javax.jws,
javax.persistence;version="[1.1,2)",
javax.servlet;version="[2.5,3)",
javax.xml.bind,
javax.xml.bind.annotation,
javax.xml.bind.annotation.adapters,
javax.xml.datatype,
javax.xml.namespace,
javax.xml.parsers,
javax.xml.transform,
javax.xml.transform.stream,
javax.xml.validation,
javax.xml.ws;version="[2.2,3)",
javax.xml.ws.soap;version="[2.2,3)",
javax.xml.ws.wsaddressing;version="[2.2,3)",
org.apache.commons.lang;version="[2.5,3)",
org.apache.commons.logging;version="[1.1,2)",
org.apache.cxf.jaxws;version="[2.4,3)",
org.apache.cxf.jaxws.spi;version="[2.4,3)",  <--- imported
org.apache.cxf.ws.addressing;version="[2.4,3)",
org.apache.felix.gogo.commands;version="[0.10,1)",
org.apache.openjpa.enhance;version="[2.2,3)",
org.apache.openjpa.util;version="[2.2,3)",
org.osgi.framework;version="[1.5,2)",
org.osgi.service.blueprint;version="[1.0.0,2.0.0)",
org.springframework.beans.factory.xml;version="[3.0,4)",
org.springframework.context;version="[3.0,4)",
org.springframework.context.support;version="[3.0,4)",
org.w3c.dom,
org.xml.sax

Require-Bundle = 
org.apache.cxf.bundle

我不确定我还需要做什么。

如果它很重要。容器是 karaf 2.2.7

解决小熊维尼的回答:

1- cxf-bundle 正在导出这个包:org.apache.cxf.jaxws.spi;version="2.4.3.fuse-01-02"

2- 捆绑包已启动。错误发生在运行时。

3- 清单是使用 maven-bundle-plugin 创建的,它应该创建整个列表

4- 创建 web 服务端点时发生错误:

TopologyIFPortType impl = new TopologyWS();
    String addressTopology = "http://localhost:" + port
            + "/nsp/webservice/topology";
    topologyEndpoint = (EndpointImpl) Endpoint.create(impl);
    topologyEndpoint.getFeatures().add(new WSAddressingFeature());
    topologyEndpoint.publish(addressTopology);

完整的痕迹:

 javax.xml.ws.spi.FactoryFinder$ConfigurationError: Provider      org.apache.cxf.jaxws.spi.ProviderImpl not found
at javax.xml.ws.spi.FactoryFinder$2.run(FactoryFinder.java:130)
at javax.xml.ws.spi.FactoryFinder.doPrivileged(FactoryFinder.java:220)
at javax.xml.ws.spi.FactoryFinder.newInstance(FactoryFinder.java:124)
at javax.xml.ws.spi.FactoryFinder.access$200(FactoryFinder.java:44)
at javax.xml.ws.spi.FactoryFinder$3.run(FactoryFinder.java:211)
at javax.xml.ws.spi.FactoryFinder.doPrivileged(FactoryFinder.java:220)
at javax.xml.ws.spi.FactoryFinder.find(FactoryFinder.java:160)
at javax.xml.ws.spi.Provider.provider(Provider.java:43)
at javax.xml.ws.Endpoint.create(Endpoint.java:41)
at javax.xml.ws.Endpoint.create(Endpoint.java:37)
at org.opennaas.extensions.idb.webservice.WebServiceHolder.startTopology(WebserviceControl.java:78)
at org.opennaas.extensions.idb.webservice.WebServiceHolder.start(WebserviceControl.java:60)
at org.opennaas.extensions.idb.webservice.WebserviceControl.startWebservices(WebserviceControl.java:32)
at org.opennaas.extensions.idb.shell.StartWebservices.doExecute(StartWebservices.java:16)
at org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:38)
at org.apache.felix.gogo.commands.basic.AbstractCommand.execute(AbstractCommand.java:35)
at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)
at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:474)
at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:400)
at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
at org.apache.karaf.shell.console.jline.Console.run(Console.java:240)
at java.lang.Thread.run(Thread.java:679)

【问题讨论】:

  • @santiagozky:你能更新一下这个状态吗?因为我遇到了同样的问题...谢谢
  • 嗨@kandy。抱歉,这是 2012 年的,我什么都不记得了。正如 Christian 所说,当时我的 CXF 版本已经过时了,并不是很过时。
  • 没关系,我查一下,谢谢:)

标签: osgi cxf


【解决方案1】:

您使用的 CXF 版本似乎很旧。您应该尝试使用当前版本 2.6.1。在 2.6 中引入了许多 OSGi 改进。

您可以使用以下方式安装它: 特点:选择url cxf 2.6.1 特点:安装 cxf

【讨论】:

  • 我正在为使用该版本的系统开发插件。我会尝试看看是否可以升级。但这并不取决于我。
【解决方案2】:

别担心,OSGi 让您可以完全访问哪个包使用哪个包等信息。您只需要知道如何要求系统为您提供调试问题所需的信息。 不幸的是,我不熟悉 karaf 控制台命令,我更多地使用ProSyst's mBeddedServer OSGi framework,但由于所有这些都是 OSGi 中的标准,我可以告诉你要查找的内容,你可以在 karaf 中找到所需的命令。

因此,请检查以下内容: 1. Apache cxf bundle 安装成功了吗?是否处于“活动”状态? (从你的帖子看来是这样)

  1. 它导出的 org.apache.cxf.jaxws.spi 包的版本是什么? 这与 cxf 捆绑版本不同!!! 要查看包版本,请查看 cxf 包的清单,并查找 Export-package 标头。

  2. 您的捆绑包是否已成功安装并启动?是否处于活动状态? 如果在启动包期间出现错误“Provider not found”,那么您的依赖项与 cxf 包中提供的包不匹配,请参见第 2 点。 但是,如果在运行时出现错误,可能有多种原因:

  3. 您尚未在清单中导入所有需要的包。尝试使用可以根据您的源代码为您生成清单的分析工具。 或:

  4. 发布的代码位于例如在系统类路径上并使用系统类加载器,在 OSGI 中,由于模块化和安全原因,它无法访问捆绑类加载器。 检查系统类路径提供的内容,而不是 OSGi 包提供的内容。任何使用 Class.forName 或其他反射方法的东西都不能在模块化 OSGi 框架中工作。

还有其他可能性,但您需要提供更多信息。是否有异常堆栈跟踪?这段代码涉及哪些类,它们位于类路径的什么位置?等等

【讨论】:

    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 2018-05-04
    • 2017-11-15
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多