启动Spring Boot Jar应用时遭遇NoClassDefFoundError异常求助
嘿,这个问题我之前帮同事排查过好几次,核心原因基本都是打包过程没正确把Spring Boot依赖包打进可执行Jar里,或者插件配置出了问题。给你几个一步步的排查和解决办法:
1. 先检查Maven插件配置是否正确
确保你的pom.xml里已经正确引入了Spring Boot Maven插件,并且配置了repackage目标——这是生成可执行Jar的关键。正确的配置应该是这样的:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <!-- 如果主类没自动识别到,可以手动指定 --> <configuration> <mainClass>com.database.DatabaseApplication</mainClass> </configuration> </plugin> </plugins> </build>
如果没加repackage目标,Maven只会生成普通Jar,不会把依赖包打包进去,自然找不到SpringApplication类。
2. 用正确的命令重新打包
别用mvn jar:jar这种普通打包命令,一定要用:
mvn clean package
或者
mvn clean install
这两个命令会触发Spring Boot插件的repackage流程,生成包含所有依赖的可执行Jar。
3. 验证Jar包的内容结构
打包完成后,你可以用命令查看Jar里的内容:
jar tf App.jar
看看有没有BOOT-INF/lib目录,里面应该包含所有Spring Boot相关的依赖Jar(比如spring-boot-*.jar)。如果这个目录不存在,说明打包失败了。
4. 确认主类配置没问题
要么你的主类com.database.DatabaseApplication上已经加了@SpringBootApplication注解(Spring Boot插件会自动识别这个注解的类作为主类),要么就在插件配置里手动指定了mainClass,两者选其一就行。
补充说明
Spring Boot的可执行Jar有特殊的目录结构:BOOT-INF/classes放你的代码,BOOT-INF/lib放所有依赖,还有专门的启动器类来加载这些内容。如果是普通Jar,没有这个结构,运行java -jar的时候就找不到依赖类,就会报你遇到的NoClassDefFoundError/ClassNotFoundException。
内容的提问来源于stack exchange,提问作者Harshit

