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

问题描述 投票:0回答:1

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

这是堆栈跟踪:

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>
java cxf
1个回答
0
投票

发生IncompatibleClassChangeError是因为某些代码是针对一个版本的API编译的,但是在运行时,正在加载不兼容的API版本。

(在这种情况下,“实现类”不兼容意味着一个类已被声明为implements Something,但在运行时,Something原来是一个类而不是一个接口。不允许这个API更改。)

问题是你所包含的堆栈跟踪并没有告诉我们不兼容性出现在哪个类中,以及它与之不兼容。唯一真实的线索是CXF似乎正在加载“提供者”

那么解决方案是什么?

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

  1. 检查您从哪里获得堆栈跟踪的日志,以查找可能告诉您正在加载的内容的其他日志消息。
  2. 检查运行时平台上各种CXF JAR文件的版本。
  3. 检查Webapp本身和Tomcat的共享库目录中是否没有不同版本的JAR。
  4. 修改Tomcat日志记录配置以将org.apache.catalina.loader包的日志记录级别设置为DEBUG。这将记录从中加载每个类的JAR文件。
© www.soinside.com 2019 - 2024. All rights reserved.