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

2023-12-09

我们在运行 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>

An IncompatibleClassChangeError发生这种情况的原因是,某些代码是针对某个版本的 API 编译的,但在运行时正在加载不兼容版本的 API。

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

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

那么解决办法是什么呢?

没有灵丹妙药。您需要进行一些挖掘才能找出实际问题是什么:

  1. 检查从中获取堆栈跟踪的日志中是否有其他日志消息,这些消息可能会告诉您正在加载的内容。
  2. 检查运行平台上各个CXF JAR文件的版本。
  3. 检查 Web 应用程序本身和 Tomcat 的共享库目录中是否有不同版本的 JAR。
  4. 修改 Tomcat 日志记录配置以设置日志记录级别org.apache.catalina.loader打包到DEBUG。这将记录加载每个类的 JAR 文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复 java.lang.InknownClassChangeError:使用 cxf 实现类 的相关文章

随机推荐