升级cxf-bundle至3.0.0-milestone2后报找不到主类错误如何排查
CXF依赖升级触发「Could not find or load main class」排查步骤
你当前的依赖变更如下:
- 原稳定版本依赖:
dependency org="org.apache.cxf" name="cxf-bundle" rev="2.7.16" - 升级后的测试版本依赖:
dependency org="org.apache.cxf" name="cxf-bundle" rev="3.0.0-milestone2"
按以下顺序定位根因即可:
- 先导出两个版本的全量依赖树做逐行对比
如果你用Ant+Ivy管理依赖,执行ivy:report生成全量依赖报告;如果是Maven项目执行mvn dependency:tree -Dverbose > dep_diff.txt。重点核对两类差异:- 3.0里程碑版本是否将原2.7.16中compile范围的传递依赖改成了provided/test范围,导致构建时这些依赖没有被带入最终运行的类路径
- 是否存在基础依赖的版本冲突,重点排查
javax.ws.rs、javax.xml.bind、Spring核心包、commons系列工具包,这类依赖版本不兼容会触发类加载连锁失败,JVM对外只会抛出无法加载主类的笼统错误,不会直接报具体缺失的类名
- 直接检查最终构建产物的实际内容
把编译生成的可执行jar/war包解压后核对三点:- 确认你项目自身的主类class文件存在于包内对应路径,和
META-INF/MANIFEST.MF中配置的Main-Class路径完全一致,排除依赖升级触发构建插件异常、导致主类没被打进包的情况 - 检查
META-INF/services目录下的SPI配置文件是否存在重复冲突,CXF 3.x大版本调整了大量SPI配置,不同版本的同个SPI配置文件互相覆盖时,会在类加载初始化阶段直接失败 - 用
java -verbose:class -jar 你的构建产物.jar命令启动程序,控制台会打印JVM加载每一个类的顺序和结果,直接看最后一个加载失败的类,就是触发问题的根因——90%以上的「找不到主类」错误都不是主类本身缺失,而是主类依赖的某个类加载失败,被JVM包装成了笼统的主类加载错误
- 确认你项目自身的主类class文件存在于包内对应路径,和
- 注意你升级的3.0.0-milestone2是早期测试里程碑版本,并非正式稳定版
该版本是CXF 3.0正式版发布前半年的测试版本,本身存在已知的打包缺陷:cxf-bundle在该版本中没有将所有必要的运行依赖打入bundle,同时存在和JDK 8版本的类兼容问题,如果你用JDK 8及以上版本运行,该版本中部分类依赖了JDK 8已移除的Sun私有API,会直接触发类加载失败。
- 快速验证依赖缺失问题
可以把2.7.16版本cxf-bundle关联的所有jar包,临时加入3.0.0-milestone2版本的运行类路径,如果程序能正常启动,再逐个移除多余的jar缩小范围,很快就能定位到具体缺失/冲突的依赖。
内容的提问来源于stack exchange,提问作者Bob Bader
相关产品推荐
相关产品推荐

