Spring Boot无法加载依赖类问题求助(已确认类存在)
排查Spring Boot可执行Jar的NoClassDefFoundError问题
结合你的场景(Spring Boot 3.0.13 + JDK17,配置exec分类器,依赖存在但类加载失败),可以从以下方向逐一排查:
1. 模块化JDK的模块声明问题
JDK17默认启用模块化机制,若codegen-1.1.1001-SNAPSHOT.jar是包含module-info.java的模块化JAR,而主项目未声明对它的模块依赖,会直接导致类加载失败:
- 排查步骤:
- 解压
codegen依赖Jar,检查是否存在module-info.class文件 - 若存在,在主项目的
module-info.java中添加requires <codegen的模块名>;(模块名对应module-info.java中的module声明) - 若主项目无
module-info.java,可在启动命令中添加--add-modules <codegen的模块名>参数强制加载该模块
- 解压
2. Spring Boot Maven插件打包完整性问题
配置classifier>exec</classifier>后,需确保打包流程正确触发Spring Boot的重打包逻辑:
- 排查步骤:
- 确认打包命令使用
mvn clean package spring-boot:repackage,而非仅mvn clean package(仅执行package无法生成符合规范的可执行Jar结构) - 检查生成的
execJar中BOOT-INF/classpath.idx文件,确认codegen-1.1.1001-SNAPSHOT.jar被列在类路径清单中 - 若清单中无该依赖,可在插件配置中添加
<includeGroupIds>com.sp</includeGroupIds>强制包含该依赖组
- 确认打包命令使用
3. 类的间接依赖缺失
NoClassDefFoundError有时并非目标类本身缺失,而是该类依赖的其他类无法加载:
- 排查步骤:
- 查看完整错误栈,定位
Caused by: ClassNotFoundException指向的具体类(这才是真正缺失的依赖) - 检查该类是否存在于
codegenJar或其他项目依赖中 - 若缺失,在
pom.xml中添加对应依赖
- 查看完整错误栈,定位
4. 包结构冲突导致类加载顺序异常
主项目包路径com.sp.obt.supplier与codegen中的类路径com.sp.obt.supplier.qantas.codegen.qbr存在重叠,可能导致Spring Boot的类加载器优先加载主项目中的类,而非依赖Jar中的目标类:
- 排查步骤:
- 检查主项目是否存在同名包路径
com.sp.obt.supplier.qantas.codegen.qbr,若有则移除或重命名该包 - 在启动命令中添加
-verbose:class参数,查看类加载详细日志,确认EarnQuoteRequest的加载来源Jar
- 检查主项目是否存在同名包路径
5. JDK版本兼容性问题
确认codegen依赖的编译版本与JDK17兼容:
- 排查步骤:
- 使用命令
javap -verbose com.sp.obt.supplier.qantas.codegen.qbr.EarnQuoteRequest查看类的编译版本(major version字段:61对应JDK17,55对应JDK11) - 若
codegen用低于JDK17的版本编译且未指定--release 17,需重新编译该依赖以适配JDK17
- 使用命令
内容的提问来源于stack exchange,提问作者tuk
相关产品推荐
相关产品推荐

