Spring Boot项目IntelliJ运行正常,打包成.jar后页面空白
问题分析与解决方案
核心问题定位
从日志和代码对比来看,IDE内运行正常但打包成可执行jar后请求先映射到目标控制器、随即跳转到ErrorController,问题根源集中在jar打包配置错误、启动类逻辑异常、依赖冲突这几个点上。
具体修复方案
1. 修正Tomcat依赖范围
你的pom.xml中spring-boot-starter-tomcat设置了provided范围,这会导致打包jar时不包含内嵌Tomcat依赖,但jar运行必须依赖内嵌容器才能启动:
<!-- 错误配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
修改为:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!-- 移除provided,默认compile范围,打包时自动包含 --> </dependency>
2. 修复启动类上下文加载逻辑
主类的configure方法错误传入了SpringApplicationBuilder.class,导致Spring无法正确加载应用上下文,应该传入当前主类:
// 错误代码 @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(SpringApplicationBuilder.class); }
替换为:
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(EmailCalendarJavaApplication.class); }
同时恢复@SpringBootApplication注解,它已包含@Configuration、@EnableAutoConfiguration、@ComponentScan,无需重复声明:
@SpringBootApplication @EnableScheduling public class EmailCalendarJavaApplication extends SpringBootServletInitializer { // ... 其余代码保留 }
3. 解决Servlet API依赖冲突
Spring Boot 3.x基于Jakarta EE 9规范,你依赖的javax.servlet-api与Jakarta规范不兼容,替换为对应Jakarta版本:
<!-- 移除错误依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <!-- 添加正确的Jakarta依赖 --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency>
4. 统一依赖版本管理
所有Spring Boot Starter依赖无需手动指定版本,父依赖spring-boot-starter-parent已统一管控,移除手动添加的版本号避免版本不一致:
<!-- 示例:移除version属性 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <!-- 其他Starter依赖同理 -->
5. 完善打包插件配置
确保spring-boot-maven-plugin包含repackage目标,保证生成可执行jar:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>
验证步骤
- 执行
mvn clean package重新打包 - 用
java -jar BeeTasks.jar启动应用 - 查看日志是否还存在跳转到ErrorController的情况,同时检查是否出现
ResourceHttpRequestHandler处理静态资源的日志
内容的提问来源于stack exchange,提问作者Veseha
相关产品推荐
相关产品推荐

