You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:13:05