SpringBoot替换Tomcat为Jetty启动缺失ServletWebServerFactory报错
SpringBoot替换Tomcat为Jetty启动失败排查方案
报错核心原因是应用运行时Classpath中找不到Jetty对应的ServletWebServerFactory实现,按以下顺序排查即可:
- 校验依赖加载正确性
配置写对但依赖没实际加载是最高发的原因:- 执行
mvn clean install -U强制拉取更新依赖,避免本地Maven缓存异常 - 执行
mvn dependency:tree查看实际依赖树,确认两个结果:- 所有
spring-boot-starter-tomcat依赖已被完全排除,没有其他starter传递引入Tomcat包 spring-boot-starter-jetty及其核心传递依赖(jetty-server、spring-boot-jetty-core等)已存在,且scope为默认的compile(如果设置为test/provided会导致运行时不加载)
- 所有
- 多模块项目需确认:Tomcat排除规则、Jetty依赖都配置在启动类所在的模块中,而非其他未被依赖的子模块
- 执行
- 校验版本兼容性
不要手动指定Jetty依赖的版本号,SpringBoot官方的starter-parent已经管理了和当前版本完全适配的Jetty版本,手动指定不兼容的版本会导致自动配置类失效。如果之前手动加过<version>标签,直接删除即可,用SpringBoot默认管理的版本重试。 - 校验自动配置是否被意外关闭
- 检查启动类的
@SpringBootApplication、@EnableAutoConfiguration注解,确认没有exclude掉Jetty相关的自动配置类 - 检查配置文件(application.yml/application.properties),如果存在
spring.main.web-application-type=none配置,直接删除,或者改为spring.main.web-application-type=servlet
- 检查启动类的
- 兜底手动注册容器工厂
以上配置都校验无误仍报错的话,可以在自定义配置类中手动注册Jetty容器Bean:import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class WebServerConfig { @Bean public ServletWebServerFactory jettyWebServerFactory() { return new JettyServletWebServerFactory(); } }
90%以上的同类问题都是依赖未正确加载导致的,优先排查依赖树即可快速定位。
内容的提问来源于stack exchange,提问作者Kaushik
相关产品推荐
相关产品推荐

