bigywater.tech
Spring · 172

Boot 4 里 Undertow 去哪了:starter-undertow 解析不了,换 Jetty 与硬塞 3.5 的 starter 各会怎样

Boot 4 升级后 spring-boot-starter-undertow 报 version is missing 怎么办?server.undertow 配置还生不生效?换成 Jetty 要改什么?硬加 Boot 3.5 的 starter 会怎样?这篇在 Spring Boot 4.0.8 上逐个启动。

version is missing
Boot 4.0.8 的 BOM 里没有 spring-boot-starter-undertow,不带版本的依赖在 Maven 解析阶段就失败
25 → 0
server.undertow.* 配置项在 3.5.16 有 25 个,在 4.0.8 的配置元数据里为 0
仍跑 Tomcat
在 Boot 4 里加 3.5.16 的 starter-undertow 且 Tomcat 还在时,启动成功但实际运行的是 TomcatWebServer

Maven 解析

实测 · 本机执行输出
  Boot 3.5.16:解析成功,Undertow 版本 2.3.24.Final
  Boot 4.0.8:解析失败,Maven 报 'dependencies.dependency.version' for org.springframework.boot:spring-boot-starter-undertow:jar is missing(BOM 里没有这个坐标的版本)

3.5.16 能解析,4.0.8 报 version is missing。

配置项数量

实测 · 本机执行输出
  server.tomcat.*:3.5.16 有 53 个,4.0.8 有 54 个
  server.jetty.*:3.5.16 有 27 个,4.0.8 有 27 个
  server.undertow.*:3.5.16 有 25 个,4.0.8 有 0 个

server.undertow.* 从 25 个变成 0 个。

实现类

实测 · 本机执行输出
  启动成功,WebServer 实现类 org.springframework.boot.tomcat.TomcatWebServer
  日志:INFO  o.s.b.tomcat.TomcatWebServer - Tomcat started on port <端口> (http) with context path '/'
  -- 3.5.16 默认 starter-web
  启动成功,WebServer 实现类 org.springframework.boot.web.embedded.tomcat.TomcatWebServer
  日志:INFO  o.s.b.w.e.t.TomcatWebServer - Tomcat started on port <端口> (http) with context path '/'
  -- 3.5.16 starter-web 去掉 Tomcat 加 starter-undertow
  启动成功,WebServer 实现类 org.springframework.boot.web.embedded.undertow.UndertowServletWebServer
  日志:INFO  o.s.b.w.e.u.UndertowWebServer - Undertow started on port <端口> (http) with context path '/'

4.0.8 的 Tomcat 实现类换了包,3.5.16 里换 Undertow 能启动。

换 Jetty

实测 · 本机执行输出
  启动成功,WebServer 实现类 org.springframework.boot.jetty.servlet.JettyServletWebServer
  日志:INFO  o.s.boot.jetty.JettyWebServer - Jetty started on port <端口> (http/1.1) with context path '/'

去掉 Tomcat、加 starter-jetty 即可启动。

硬塞 3.5 的 starter

实测 · 本机执行输出
  启动成功,WebServer 实现类 org.springframework.boot.tomcat.TomcatWebServer
  日志:INFO  o.s.b.tomcat.TomcatWebServer - Tomcat started on port <端口> (http) with context path '/'

Tomcat 还在时悄悄继续跑 Tomcat。

去掉 Tomcat

实测 · 本机执行输出
  启动失败 ApplicationContextException ← 根因 MissingWebServerFactoryBeanException:No qualifying bean of type 'org.springframework.boot.web.server.servlet.ServletWebServerFactory' available: Unable to start AnnotationConfigServletWebServerApplicationContext due to missing ServletWebServerFactory bean

MissingWebServerFactoryBeanException。

分步演示

Undertow
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / OpenJDK 21.0.12(Homebrew) / Spring Boot 4.0.8(Spring Framework 7.0.9、Tomcat 11.0.24) / Spring Cloud 2025.1.3;用 javac 编译、java 直接运行,依赖由 Maven 从 Maven Central 解析;数字每次运行会有小幅抖动(Spring Boot 4.0.8 与 3.5.16;Tomcat 11.0.24,Jetty 12.1.12(类路径上的 jar 版本);配置项数量取自配置元数据:4.0.8 来自 130 个 spring-boot 模块 jar,3.5.16 来自 starter-web、starter-undertow、starter-jetty 的类路径;每种变体启动一次并打印 WebServer 的实现类)
    • 没有验证:Undertow 在 Boot 4 里被移除的官方原因(这里只记录了现象,没有查发布说明);Jetty 与 Tomcat 在 Boot 4 下的性能对比;server.jetty.* 具体哪几项属性有变化;WebFlux 在 Boot 4 里使用 Undertow 的可能性;旧的 server.undertow.* 属性残留时是否有启动警告(没有跑 spring-boot-properties-migrator)
    京ICP备2026067502号-1京公网安备11010502063487号