设置Tomcat 10.1.6后Spring Boot 3.3.4应用启动失败求助
问题核心
Spring Boot 3.3.4项目中手动指定Tomcat版本为10.1.6后启动失败,报错提示org.apache.coyote.AbstractProtocol类中不存在setMaxQueueSize(int)方法,而Spring Boot的TomcatWebServerFactoryCustomizer组件正在调用这个方法。
原因
Spring Boot的自动配置组件是和它默认依赖的Tomcat版本绑定的。你指定的Tomcat 10.1.6版本过旧,其中AbstractProtocol类的setMaxQueueSize方法已被移除或重命名,导致与Spring Boot 3.3.4的自动配置代码不兼容。
解决方案
方案1:放弃手动指定嵌入式Tomcat版本(推荐)
Spring Boot会自动管理所有依赖的版本兼容性,直接使用默认的嵌入式Tomcat版本即可。如果你的项目是打包成WAR部署到外部Tomcat 10.1.6,实际上不需要对齐嵌入式Tomcat的版本——WAR包部署模式下,嵌入式Tomcat的依赖会被自动排除,Spring Boot不会启动嵌入式服务器,只要Spring Boot 3.x版本本身兼容Tomcat 10.x即可(这一点完全满足)。
方案2:使用Spring Boot 3.3.4兼容的Tomcat版本
如果坚持要对齐版本,可查看Spring Boot官方依赖矩阵,选择与3.3.4兼容的Tomcat版本。比如Spring Boot 3.3.4默认依赖的Tomcat版本是10.1.20,这个版本和Spring Boot的自动配置代码完全兼容,可将extra["tomcat.version"]设置为该值。
方案3:自定义Tomcat配置(不推荐)
如果必须使用Tomcat 10.1.6,可自定义TomcatWebServerFactoryCustomizer,替换掉调用setMaxQueueSize的逻辑,改用Tomcat 10.1.6中对应的方法(比如setBacklog(int),需查阅Tomcat 10.1.6官方文档确认)。但这种方式需要维护额外代码,且容易引入其他兼容性问题,不推荐。
内容的提问来源于stack exchange,提问作者user1829826

