Spring Boot 2.0.1.RELEASE版应用启动后立即关闭问题求助
我来帮你分析这个问题——你遇到的情况在Spring Boot版本从1.x升级到2.x时很常见,虽然你已经引入了spring-boot-starter-web,但还是有几个容易被忽略的关键点:
可能的原因及对应解决方案
1. 启动类的配置或位置有误
Spring Boot 2.x对组件扫描的规则和1.x保持一致,但如果你的启动类位置不对,或者手动修改了自动配置范围,可能会导致web相关的自动配置类没被加载。比如启动类放在了子包下,或者自定义了@ComponentScan的扫描路径,漏掉了web自动配置的包。
解决办法:
- 把启动类放到项目的根包下(比如你的项目基础包是
com.myapp.demo,启动类DemoApplication就直接放在这个包下),让@SpringBootApplication自动扫描所有子包的组件。 - 移除不必要的
@ComponentScan或@EnableAutoConfiguration自定义配置,交给@SpringBootApplication默认处理即可。
2. 不小心禁用了Web应用模式
Spring Boot 2.x新增了spring.main.web-application-type属性,用来指定应用的运行类型。如果你的配置文件(application.properties/application.yml)里不小心设置了:
spring.main.web-application-type=NONE
应用会以非Web模式启动,自然会在初始化完成后立即关闭。
解决办法:
- 检查配置文件,删除这个属性,或者明确设置为Servlet模式:
spring.main.web-application-type=SERVLET
这样就能强制启动内嵌Tomcat容器了。
3. 依赖冲突或缺失
Spring Boot 2.x升级了大量底层依赖(比如Spring Framework从4.x升到5.x,Tomcat版本也同步升级),如果你的pom.xml里有其他自定义依赖,可能和spring-boot-starter-web的依赖产生冲突,导致Tomcat容器无法正常初始化。
解决办法:
- 运行
mvn dependency:tree命令生成依赖树,检查是否有spring-boot-starter-tomcat被意外排除,或者存在版本不一致的情况。 - 确保没有手动添加排除
spring-boot-starter-tomcat的配置,它是spring-boot-starter-web默认自带的内嵌容器依赖。
4. 通过启动日志定位问题
如果上面的方法都没解决,建议开启DEBUG级别的启动日志,查看自动配置的细节,比如哪些Web相关的配置类没被加载,或者加载失败的原因。
操作步骤:
- 在
application.properties中添加日志配置:
logging.level.org.springframework.boot.autoconfigure=DEBUG
启动应用后,重点查看WebMvcAutoConfiguration、TomcatServletWebServerFactoryAutoConfiguration这些类的加载日志,就能找到问题根源。
为什么1.4.2.RELEASE版本正常?
因为Spring Boot 1.x中没有web-application-type这个属性,只要引入spring-boot-starter-web就会默认启动Tomcat,自动配置的逻辑也相对宽松,所以不会出现这类问题。而2.x对配置和依赖管理的严谨性更高,才会出现这种版本差异导致的启动问题。
内容的提问来源于stack exchange,提问作者Kou Chibin

