问题现象
代码在本地 IDE 中可以正常运行,但在打包并部署到服务器后,执行 java -jar 时却报错:
text
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication
原因分析
既然本地环境能跑通,说明业务逻辑本身没有问题,问题大概率出在构建打包环节。我们需要确认生成的 JAR 包是否包含了必要的依赖库。
使用命令查看 JAR 包内部结构:
jar tf java-project-1.0-SNAPSHOT.jar
如果输出结果类似这样,说明依赖缺失:
text
com/ # 仅有你的代码
META-INF/ # 元数据
而正确的 Spring Boot 可执行 JAR 包结构应当包含 BOOT-INF 目录,其中存放了编译后的类文件和所有第三方依赖:
text
BOOT-INF/
BOOT-INF/classes/
com/
fancier/
fancyblog/
web/
FancyBlogWebApplication.class
BOOT-INF/lib/
spring-boot-2.6.3.jar
spring-context-5.3.15.jar
logback-classic-1.2.10.jar
...
出现上述问题的根本原因,是项目中没有引入正确的 Maven 打包插件。对于 Spring Boot 项目,必须配置 spring-boot-maven-plugin 才能将依赖正确合并进 JAR 包。
解决方案
在项目的 pom.xml 文件中,确保 <build> 节点下配置了如下插件依赖:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>


