Spring Boot配置undertow后bootRun仍用Tomcat的问题
解决Spring Boot用Undertow替代Tomcat的问题
你的问题核心在于对providedRuntime的使用场景理解有误,以及依赖配置方式不对,咱们一步步梳理解决:
1. 为什么providedRuntime没生效?
providedRuntime这个依赖配置是给将应用打包成WAR部署到外部Servlet容器(比如独立运行的Tomcat服务器)时用的,它的作用是告诉构建工具:这个依赖在目标运行环境中已经存在,打包时无需包含。但你现在用./gradlew bootRun启动,属于内嵌容器启动的场景,这个配置完全不适用,所以Spring Boot还是默认启用了spring-boot-starter-web自带的Tomcat。
2. 正确的Gradle依赖配置
要在内嵌容器场景下切换到Undertow,你需要先排除spring-boot-starter-web中的Tomcat依赖,再引入Undertow的starter作为常规依赖:
dependencies { implementation('org.springframework.boot:spring-boot-starter-web') { // 剔除starter-web自带的Tomcat依赖 exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' } // 引入Undertow内嵌容器starter implementation 'org.springframework.boot:spring-boot-starter-undertow' testImplementation 'org.springframework.boot:spring-boot-starter-test' }
配置完成后,重新执行./gradlew bootRun,就能在启动日志里看到Undertow初始化的相关信息了。
3. 关于ServletInitializer的疑问
你编写的ServletInitializer类是用来支持WAR包部署到外部Servlet容器的,它的作用是让外部容器能正确加载Spring Boot应用。但在你用bootRun启动内嵌容器的场景下,这个类不会被触发,也不会影响内嵌容器的选择——只要依赖配置正确,Spring Boot就会自动使用Undertow作为内嵌容器,和这个类没有关系。如果之后你需要打包成WAR包部署到外部容器,这个类才会发挥作用。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

