Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复java.lang.CompatibleClassChangeError:使用cxf实现类_Java_Cxf - Fatal编程技术网

如何修复java.lang.CompatibleClassChangeError:使用cxf实现类

如何修复java.lang.CompatibleClassChangeError:使用cxf实现类,java,cxf,Java,Cxf,在运行openjdk版本“1.8.0_201”的RedHat linux环境中,在tomcat 8上进行SOAP客户端调用时遇到了一个问题,而在Windows机器(tomcat 8,Oracle java 8)和AIX(Oracle java 8,tomcat 7)上进行类似配置时,同样的调用也可以正常工作 以下是stacktrace: java.lang.IncompatibleClassChangeError: Implementing class at java.lang.

在运行openjdk版本“1.8.0_201”的RedHat linux环境中,在tomcat 8上进行SOAP客户端调用时遇到了一个问题,而在Windows机器(tomcat 8,Oracle java 8)和AIX(Oracle java 8,tomcat 7)上进行类似配置时,同样的调用也可以正常工作

以下是stacktrace:

java.lang.IncompatibleClassChangeError: Implementing class
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2401)
        at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:859)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1185)
        at org.apache.cxf.ws.addressing.impl.AddressingFeatureApplier.initializeProvider(AddressingFeatureApplier.java:36)
        at org.apache.cxf.ws.addressing.WSAddressingFeature.initializeProvider(WSAddressingFeature.java:46)
        at org.apache.cxf.feature.AbstractFeature.initialize(AbstractFeature.java:49)
        at org.apache.cxf.frontend.ClientFactoryBean.applyFeatures(ClientFactoryBean.java:112)
        at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:100)
        at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:157)
        at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:142)
        at org.apache.cxf.jaxws.ServiceImpl.createPort(ServiceImpl.java:476)
        at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:343)
        at javax.xml.ws.Service.getPort(Service.java:160)
使用 cxf版本2.7.18

pom.xml代码段

      <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>${cxf.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>${cxf.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>${cxf.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-client</artifactId>
        <version>3.0.16</version>
      </dependency>

org.apache.cxf
cxf rt前端jaxws
${cxf.version}
org.apache.cxf
cxf rt传输http jetty
${cxf.version}
org.apache.cxf
cxf rt传输http
${cxf.version}
org.apache.cxf
cxf rt rs客户端
3.0.16

发生
不兼容ClassChangeError
的原因是某些代码是针对某个API版本编译的,但在运行时加载了该API的不兼容版本

(在这种情况下,“实现类”不兼容意味着类被声明为
实现某个东西
,但在运行时
某个东西
变成了类而不是接口。不允许此API更改。)

问题是您包含的stacktrace没有告诉我们不兼容发生在哪个类中,以及它与什么不兼容。唯一真正的线索是CXF似乎正在加载一个“提供者”

那么解决方案是什么呢

没有银弹。您需要进行一些挖掘,以找出实际问题:

  • 检查从中获取stacktrace的日志,查看其他可能会告诉您加载内容的日志消息
  • 在运行时平台上检查各种CXF JAR文件的版本
  • 检查webapp本身和Tomcat的共享库目录中没有不同版本的jar
  • 修改Tomcat日志记录配置,将
    org.apache.catalina.loader
    包的日志记录级别设置为
    DEBUG
    。这将记录从中加载每个类的JAR文件

  • 由于导入了不同版本的库和用于生成WSDL存根的插件,我获得了
    java.lang.CompatibleClassChangeError

    这些依赖关系使我的应用程序在启动时崩溃

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>3.3.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>3.4.3</version>
        </dependency>
    
    
    org.apache.cxf
    cxf弹簧引导启动器jaxws
    3.3.0
    org.apache.cxf
    cxf-codegen插件
    3.4.3
    
    修改所使用插件的版本(在依赖项和插件声明中),应用程序将无错误地引导,web服务已正确部署并可以处理请求

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>3.3.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>3.3.0</version>
        </dependency>
    
    
    org.apache.cxf
    cxf弹簧引导启动器jaxws
    3.3.0
    org.apache.cxf
    cxf-codegen插件
    3.3.0