Spring Boot应用执行java -jar启动后立即退出,如何解决?
你配置了providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat',这个依赖范围意味着该依赖仅在编译和运行时由环境提供,不会被打包到最终的Jar文件中。而Spring Boot Web应用需要嵌入式Tomcat容器来监听HTTP请求并保持进程运行,缺少Tomcat时,应用启动后没有持续运行的线程,主线程执行完毕就会立即退出。
方案1:将Tomcat依赖改为implementation范围
直接修改build.gradle的依赖配置,把Tomcat的依赖范围从providedRuntime改成implementation,这样打包时Tomcat会被包含到Jar中,启动后容器会持续运行:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' }
修改后重新执行gradle assemble,再用java -jar运行生成的Jar包即可。
方案2:保留providedRuntime但配置Spring Boot插件生成可执行Jar
如果你的应用需要同时支持嵌入式Tomcat(本地运行)和外部容器部署(如Tomcat服务器),可以保留providedRuntime配置,同时确保Spring Boot插件的bootJar任务启用,该任务会自动将providedRuntime依赖包含到可执行Jar中:
- 确保已应用Spring Boot插件(通常
build.gradle顶部已有配置):
plugins { id 'org.springframework.boot' version '<你的Spring Boot版本>' id 'io.spring.dependency-management' version '<对应版本>' id 'java' }
- 显式启用
bootJar任务(默认已启用,可添加确保生效):
bootJar { enabled = true }
执行gradle bootJar(或gradle assemble,默认包含bootJar)生成可执行Jar,运行后Tomcat容器会正常启动并保持进程运行。
补充说明:providedRuntime适合在将应用打包为War包部署到外部Tomcat时使用,此时外部容器会提供Tomcat依赖;但如果是生成可执行Jar运行,必须确保Tomcat依赖被包含在Jar内,否则应用会启动后立即退出。
内容的提问来源于stack exchange,提问作者JGleason

