Spring Boot jar运行报NoClassDefFoundError,但插件可正常启动
问题原因分析
1. 手动配置maven-jar-plugin与spring-boot-maven-plugin打包逻辑冲突
Spring Boot的spring-boot-maven-plugin本身就负责生成可执行Fat Jar:它会自动把项目代码打包到BOOT-INF/classes,依赖包打包到BOOT-INF/lib,同时自动生成包含JarLauncher、Start-Class等关键配置的MANIFEST.MF。
你手动添加maven-jar-plugin并指定Manifest配置,会覆盖或干扰spring-boot-maven-plugin的默认打包流程——最终生成的jar可能只是仅包含项目代码的普通jar,并没有把依赖包打包到BOOT-INF/lib目录里。当用java -jar启动时,JarLauncher找不到BOOT-INF/lib中的Spring Boot核心依赖,就会抛出NoClassDefFoundError。
2. 不同启动方式的本质差异
mvn spring-boot:run或IDEA中执行插件:直接从本地Maven仓库加载依赖,结合编译后的项目类文件启动,不需要依赖Fat Jar的完整结构,所以能正常运行。java -jar启动:完全依赖Fat Jar内部的BOOT-INF/classes和BOOT-INF/lib目录,如果这两个目录内容不完整(比如缺少核心依赖),就会触发类找不到的错误。
3. 打包命令可能有误
如果你执行的是普通的mvn package,只会触发maven-jar-plugin生成普通jar;而正确生成可执行Fat Jar需要执行mvn clean package spring-boot:repackage,或者确保spring-boot-maven-plugin已正确绑定到package阶段。
解决建议
- 移除手动添加的
maven-jar-plugin配置,让spring-boot-maven-plugin全权负责打包和Manifest生成。 - 执行
mvn clean package(若插件已绑定package阶段),或mvn clean spring-boot:package来生成正确的可执行Fat Jar。 - 检查生成的jar内部结构:解压后确认存在
BOOT-INF/classes和BOOT-INF/lib,且lib目录下包含Spring Boot核心依赖(如spring-boot-*.jar)。
内容的提问来源于stack exchange,提问作者KJ0797
相关产品推荐
相关产品推荐

