繁体   English   中英

CXF:java.lang.NoClassDefFoundError:javax/xml/ws/BindingProvider

[英]CXF: java.lang.NoClassDefFoundError: javax/xml/ws/BindingProvider

我正在尝试在 CQ 中实现 Apache CXF。 我已经使用 cxf-codegen-plugin 从 WSDL 生成了代理类。 现在我的CxfServiceImpl.java如下所示 -

import net.webservicex.ConvertTemperatureSoap;
import net.webservicex.TemperatureUnit;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.osgi.framework.BundleContext;
import org.osgi.service.component.ComponentContext;

@Component(label = "CXF Service", immediate = true, metatype = true)
@Service(CxfService.class)
public class CxfServiceImpl implements CxfService {
    private ConvertTemperatureSoap convertTemperatureSoap;
    @Override
    public double convertCelsiusToFahrenheit(double valueToConvert) {
        return convertTemperatureSoap.convertTemp(
        valueToConvert, 
        TemperatureUnit.DEGREE_CELSIUS, 
        TemperatureUnit.DEGREE_FAHRENHEIT);
    }
    @Activate
    protected final void activate(final ComponentContext context) {
        convertTemperatureSoap =
        JaxWsClientFactory.create(
        ConvertTemperatureSoap.class,
        "http://www.w3schools.com/webservices/tempconvert.asmx");    
    }    
}

JaxWsClientFactory.java看起来像 -

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.BusFactory;
public class JaxWsClientFactory {
    public static <T> T create(Class<T> clazz, String portUrl) {
        ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
        try {
            Thread.currentThread().setContextClassLoader(BusFactory.class.getClassLoader());
            JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
            factory.setServiceClass(clazz);
            factory.setAddress(portUrl);
            return (T) factory.create();
        } finally {
            Thread.currentThread().setContextClassLoader(oldClassLoader);
        }
    }
}

我能够创建 OSGI 包并上传到 Felix 控制台。 但是当我尝试激活捆绑包时,我收到如下错误并且捆绑包状态显示为活动。

24.02.2014 20:38:41.104 *ERROR* [127.0.0.1 [1393254521079] POST /system/console/bundles/300 HTTP/1.1] com.adobe.cq.customer-bundle [com.adobe.cq.CxfServiceImpl] The activate method has thrown an exception (java.lang.NoClassDefFoundError: javax/xml/ws/BindingProvider) java.lang.NoClassDefFoundError: javax/xml/ws/BindingProvider
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2167)
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1471)
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1882)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.adobe.cq.JaxWsClientFactory.create(JaxWsClientFactory.java:12)
    at com.adobe.cq.CxfServiceImpl.activate(CxfServiceImpl.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.felix.scr.impl.helper.BaseMethod.invokeMethod(BaseMethod.java:236)
    at org.apache.felix.scr.impl.helper.BaseMethod.access$500(BaseMethod.java:37)
    at org.apache.felix.scr.impl.helper.BaseMethod$Resolved.invoke(BaseMethod.java:613)
    at org.apache.felix.scr.impl.helper.BaseMethod.invoke(BaseMethod.java:496)
    at org.apache.felix.scr.impl.helper.ActivateMethod.invoke(ActivateMethod.java:149)
    at org.apache.felix.scr.impl.manager.ImmediateComponentManager.createImplementationObject(ImmediateComponentManager.java:251)
    at org.apache.felix.scr.impl.manager.ImmediateComponentManager.createComponent(ImmediateComponentManager.java:119)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager$Unsatisfied.activate(AbstractComponentManager.java:1518)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:550)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:261)
    at org.apache.felix.scr.impl.config.ImmediateComponentHolder.enableComponents(ImmediateComponentHolder.java:328)
    at org.apache.felix.scr.impl.BundleComponentActivator.initialize(BundleComponentActivator.java:158)
    at org.apache.felix.scr.impl.BundleComponentActivator.<init>(BundleComponentActivator.java:113)
    at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:261)
    at org.apache.felix.scr.impl.Activator.bundleChanged(Activator.java:179)
    at org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:868)
    at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:789)
    at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:514)
    at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4319)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1993)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:947)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:934)
    at org.apache.felix.webconsole.internal.core.BundlesServlet.doPost(BundlesServlet.java:339)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.apache.felix.webconsole.internal.servlet.OsgiManager.service(OsgiManager.java:493)
    at org.apache.felix.webconsole.internal.servlet.OsgiManager.service(OsgiManager.java:418)
    at org.apache.felix.http.base.internal.handler.ServletHandler.doHandle(ServletHandler.java:96)
    at org.apache.felix.http.base.internal.handler.ServletHandler.handle(ServletHandler.java:79)
    at org.apache.felix.http.base.internal.dispatch.ServletPipeline.handle(ServletPipeline.java:42)
    at org.apache.felix.http.base.internal.dispatch.InvocationFilterChain.doFilter(InvocationFilterChain.java:49)
    at org.apache.felix.http.base.internal.dispatch.HttpFilterChain.doFilter(HttpFilterChain.java:33)
    at org.apache.sling.i18n.impl.I18NFilter.doFilter(I18NFilter.java:127)
    at org.apache.felix.http.base.internal.handler.FilterHandler.doHandle(FilterHandler.java:88)
    at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:76)
    at org.apache.felix.http.base.internal.dispatch.InvocationFilterChain.doFilter(InvocationFilterChain.java:47)
    at org.apache.felix.http.base.internal.dispatch.HttpFilterChain.doFilter(HttpFilterChain.java:33)
    at com.adobe.granite.license.impl.LicenseCheckFilter.doFilter(LicenseCheckFilter.java:179)
    at org.apache.felix.http.base.internal.handler.FilterHandler.doHandle(FilterHandler.java:88)
    at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:76)
    at org.apache.felix.http.base.internal.dispatch.InvocationFilterChain.doFilter(InvocationFilterChain.java:47)
    at org.apache.felix.http.base.internal.dispatch.HttpFilterChain.doFilter(HttpFilterChain.java:33)
    at org.apache.felix.http.sslfilter.internal.SslFilter.doFilter(SslFilter.java:55)
    at org.apache.felix.http.base.internal.handler.FilterHandler.doHandle(FilterHandler.java:88)
    at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:76)
    at org.apache.felix.http.base.internal.dispatch.InvocationFilterChain.doFilter(InvocationFilterChain.java:47)
    at org.apache.felix.http.base.internal.dispatch.HttpFilterChain.doFilter(HttpFilterChain.java:33)
    at org.apache.sling.security.impl.ReferrerFilter.doFilter(ReferrerFilter.java:259)
    at org.apache.felix.http.base.internal.handler.FilterHandler.doHandle(FilterHandler.java:88)
    at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:76)
    at org.apache.felix.http.base.internal.dispatch.InvocationFilterChain.doFilter(InvocationFilterChain.java:47)
    at org.apache.felix.http.base.internal.dispatch.HttpFilterChain.doFilter(HttpFilterChain.java:33)
    at org.apache.sling.engine.impl.log.RequestLoggerFilter.doFilter(RequestLoggerFilter.java:75)
    at org.apache.felix.http.base.internal.handler.FilterHandler.doHandle(FilterHandler.java:88)
    at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:76)
    at org.apache.felix.http.base.internal.dispatch.InvocationFilterChain.doFilter(InvocationFilterChain.java:47)

Caused by: java.lang.ClassNotFoundException: javax.xml.ws.BindingProvider not found by com.adobe.cq.customer-bundle [300]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1499)
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1882)
    at java.lang.ClassLoader.loadClass(Unknown Source) 

pom.xml-

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Bundle-SymbolicName>com.adobe.cq.customer-bundle</Bundle-SymbolicName>
            <Export-Package>
                com.adobe.cq.*;version=${project.version}
                javax.xml.ws*;version=2.1;-split-package:=merge-first;-noimport:=true
            </Export-Package>
            <Private-Package>
                javax.jws,
                javax.jws.*,
                javax.wsdl,
                org.xml.*,
                org.apache.cxf,
                org.apache.cxf.*,
                javax.xml,
                org.apache.servicemix.specs.locator;-split-package:=merge-first
                javax.xml.transform.stax,
                javax.net.ssl,
                org.w3c.dom,
                org.apache.ws.commons.schema.resolver.*,
                org.apache.ws.commons.schema.extensions.*,
                org.apache.ws.commons.schema.*,
                net.webservicex
            </Private-Package>
            <Include-Resource>{maven-resources}</Include-Resource>
            <Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
            <Embed-Transitive>true</Embed-Transitive>

            <Import-Package>
                org.osgi.framework,
                org.osgi.service.component.*,
                com.sun.msv.*;resolution:=optional,
                com.sun.xml.bind.marshaller.*;resolution:=optional,
                com.sun.xml.fastinfoset.stax.*;resolution:=optional,
                net.sf.cglib.*;resolution:=optional,
                org.apache.aries.*;resolution:=optional,
                org.apache.axiom.*;resolution:=optional,
                org.apache.mina.*;resolution:=optional,
                org.apache.log4j.spi.*;resolution:=optional,
                org.apache.velocity.*;resolution:=optional,
                org.osgi.service.blueprint.*;resolution:=optional,
                org.junit.*;resolution:=optional,
                org.relaxng.*;resolution:=optional,
                org.slf4j.spi.*;resolution:=optional,
                org.springframework.*;resolution:=optional,
                javax.resource.*;resolution:=optional,
                javax.mail.*;resolution:=optional,
                javax.xml.ws.spi.http.*;resolution:=optional,
                junit.framework.*;resolution:=optional,
                com.sun.*;resolution:=optional,
                sun.*;resolution:=optional,
                org.apache.*;resolution:=optional,
                org.jvnet.*;resolution:=optional,
                javax.net.*,
                javax.xml.transform.stax,
                !*
            </Import-Package>
        </instructions>
    </configuration>
</plugin>

在我的情况下,我需要在这个项目上从 Java 11 回滚到 Java 8。

我知道这不是一个长期的解决方案,但它可能对某人有帮助。

更通用的解决方案是使用:

    <dependency>
        <groupId>javax.xml.ws</groupId>
        <artifactId>jaxws-api</artifactId>
        <version>2.3.1</version>
    </dependency>

当 CXF 将代理生成委托给 JDK 时,会发生此错误。 问题在于,对于代理必须实现的所有接口,您只能设置一个类加载器。 通常,用户的类路径中没有 BindpProvider。 SO cxf 使用总线类路径,它首先在包类路径中查找,然后在 cxf 类路径中查找。

您使用哪个 CXF 版本? 在较旧的 CXF 版本中,此错误有时会产生误导。 当找不到 BindingProvider 类时,这不仅仅是问题。 当 BindingProvider 由 cxf 和用户包加载但来自不同的类加载器时,也会发生这种情况。

避免此问题的最佳方法是导入 javax.xml.ws。 因此,您最有可能找到与 cxf 相同的界面。 如果错误仍然发生,您可能有两个包导出包。

在任何情况下,您的捆绑插件说明都不应该像您的问题中那样复杂。 这只会导致问题。 你试一试。

<instructions>
  <Bundle-SymbolicName>com.adobe.cq.customer-bundle</Bundle-SymbolicName>
  <Include-Resource>{maven-resources}</Include-Resource>
  <Import-Package>
    javax.xml.ws,
    *
  </Import-Package>
</instructions>

嵌入所有依赖项有什么特殊原因吗? 当像这样使用时,CXF 通常可以很好地工作。 相反,您可以使用 CXF DOSGi 多捆绑发行版中的捆绑包将 CXF 安装到 CQ 中。

javax/xml/ws/BindingProvider类添加到您的类路径

如果您使用的是maven这里是可能的工件的快速链接

我会说先检查你的 MANIFEST.MF。 它抱怨它缺少 javax.xml.ws 包,所以检查它是否在 Import-Package 标头中。

如果不是:那是你的问题,我猜你需要将它添加到你的 pom.xml 中。

如果它那里,它会更微妙一些。

如果您已经安装了 JDK 1.6 (Java SE 6),我建议您阅读文档Using JAX-WS 2.x / Metro 1.x/2.0 with Java SE 6

我只是通过阅读附件解决了类似的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM