升级CXF 3.5.3后Java 8应用出现IncompatibleClassChangeError排查
CXF 3.5.3升级后IncompatibleClassChangeError排查方案
错误背景
升级CXF从2.7.18到3.5.3后出现以下错误:
Caused by: java.lang.IncompatibleClassChangeError: class org.apache.cxf.jaxws.WrapperClassGenerator has interface org.apache.cxf.common.util.ASMHelper as super class
已确认构建依赖树和运行时版本均为3.5.3,尝试Java endorsed机制替换jax-ws/jaxb无效,以下是针对性排查思路和解决方案:
1. 定位运行时类加载来源
- 启动应用时添加参数
java -verbose:class,在输出中搜索org.apache.cxf.jaxws.WrapperClassGenerator和org.apache.cxf.common.util.ASMHelper,查看加载这些类的jar包路径,确认是否有旧版本CXF的jar被加载(比如2.7.x版本的cxf-core或cxf-jaxws)。 - 若为Web应用,检查容器(如Tomcat)的全局lib目录、其他应用共享类加载器中是否存在遗留的CXF旧jar,这类jar会优先于应用自身依赖加载。
2. 排查隐藏的依赖冲突
- 执行
mvn dependency:tree -Dincludes=org.apache.cxf过滤所有CXF相关依赖,确认无2.7.x版本的间接依赖。 - 检查第三方依赖是否为shaded/fat jar:部分组件会将CXF类打包进自身jar,这种情况maven依赖树无法检测,需解压可疑jar包,查看是否包含
org.apache.cxf目录。
3. 修正JRE类加载优先级问题
- Java 8的endorsed机制需匹配CXF 3.5.3兼容的JEE版本组件(不要用Jakarta包):
- 确认替换的jaxws-api(2.3.3)、jaxb-api(2.3.1)版本与CXF 3.5.3依赖一致。
- 启动时显式指定endorsed目录:添加参数
-Djava.endorsed.dirs=/path/to/your/endorsed-jars,确保容器启动脚本也配置了该参数。
- 检查JRE的
lib/ext目录,移除其中的jax-ws/jaxb相关jar,避免优先加载旧版本。
4. 确保类加载器隔离正确
- 对于Web应用,确认
WEB-INF/lib下包含CXF 3.5.3的核心jar:cxf-core-3.5.3.jar、cxf-jaxws-3.5.3.jar、cxf-rt-frontend-jaxws-3.5.3.jar等,无遗漏或旧版本。 - 移除容器全局类加载器中的CXF jar(如Tomcat的
common/lib目录),强制应用使用自身WEB-INF/lib下的依赖。
5. 消除编译与运行时不一致
- 清理项目编译产物:执行
mvn clean package,避免target目录残留旧版本class文件。 - 检查IDE依赖配置:确保IDE中的maven依赖与pom.xml一致,无手动添加的旧版本CXF jar。
内容的提问来源于stack exchange,提问作者RFG
相关产品推荐
相关产品推荐

