CXF与Guava版本冲突引发UncheckedExecutionException解决方案
问题背景
在项目build.gradle中配置使用Guava 19.0、cxf-rt-rs-client 3.4.4依赖,部署运行时抛出异常,核心报错信息如下:
Exception in thread "main" com.google.common.util.concurrent.UncheckedExecutionException: org.apache.cxf.bus.extension.ExtensionException: Could not load extension class org.apache.cxf.common.util.ASMHelperImpl
根因异常:java.lang.IncompatibleClassChangeError: Implementing class
异常触发链路:ClouderaManagerClientBuilder构建客户端 -> 初始化CXF Bus -> 加载ASMHelperImpl扩展类时抛出类不兼容错误
当前依赖配置
compile group: 'com.cloudera.api', name: 'cloudera-manager-api', version:'6.3.0' compile group: 'org.slf4j', name: 'slf4j-log4j12', version:'1.7.21' compile group: 'com.github.stefanbirkner', name: 'system-rules', version:'1.3.0' compile group: 'org.eclipse.persistence', name: 'eclipselink', version:'2.4.2' compile group: 'org.apache.cxf', name: 'cxf-rt-transports-http', version:'2.7.7' compile group: 'org.json', name: 'json', version:'20140107' compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.30' testCompile group: 'junit', name: 'junit', version:'4.12' compile files('src/resources/javamail-4.0.jar') compile(group: 'commonlibs', name: 'aes128-encryption', version: '1.1.3') compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.13' compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.10.3' compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.0' compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-base', version: '2.10.3' compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version: '2.10.3' compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-jaxb-annotations', version: '2.10.3' compile group: 'org.apache.cxf', name: 'cxf-rt-rs-client', version: '3.4.4' compile group: 'com.google.guava', name: 'guava', version: '19.0'
已尝试操作
- 更换cxf-rt-rs-client版本为3.4.2
- 更换Guava版本为30-jre、15.0
以上操作均未解决问题。
排查解决步骤
- 优先处理CXF版本混装问题:当前依赖同时存在
cxf-rt-transports-http:2.7.7(2.x大版本)和cxf-rt-rs-client:3.4.4(3.x大版本),跨大版本的CXF核心类、字节码处理逻辑完全不兼容,是触发IncompatibleClassChangeError的最常见原因。将所有手动引入的CXF相关依赖版本统一对齐,不要混装2.x和3.x的CXF组件。 - 排查全量依赖树的冲突:执行
gradle dependencies命令输出完整依赖传递链路,重点排查两类冲突:- 其他依赖(包括cloudera-manager-api、本地引入的commonlibs、javamail包)是否传递引入了不同版本的ASM字节码库,CXF 3.4.4依赖ASM 7.x版本,低版本ASM会直接导致ASMHelperImpl类加载失败
- 是否存在多版本Guava、多版本Jackson重复引入的情况,这类基础工具包版本冲突也会触发类不兼容错误
发现冲突后直接通过exclude规则排除多余的低版本依赖,全链路保留同一版本的组件。
- 对齐Cloudera客户端自带的CXF版本:Cloudera Manager 6.3.0客户端API默认依赖CXF 3.0.x系列,手动引入3.4.4版本的CXF组件大概率和Cloudera客户端内置的CXF类产生冲突。可以先删除手动添加的
cxf-rt-rs-client、cxf-rt-transports-http依赖,直接使用cloudera-manager-api传递引入的CXF版本启动验证。 - 清理构建缓存:修改完依赖配置后执行
gradle clean build --refresh-dependencies,强制拉取最新依赖、清理本地旧构建缓存,避免缓存中残留的旧版本jar包被错误加载。
内容的提问来源于stack exchange,提问作者Jessica Jindal
相关产品推荐
相关产品推荐

