部署到外部Tomcat 10的War包无法启动Web服务器求助
Spring Boot 3.1 + Tomcat 10 部署报错:Failed to register 'filter errorPageFilterRegistration'
问题场景
- 包含JSP页面的Spring Boot 3.1项目,在Eclipse内嵌Tomcat中运行正常
- 打包为WAR部署到外部Tomcat 10时启动失败,核心报错:
Caused by: java.lang.IllegalStateException: Failed to register 'filter errorPageFilterRegistration' on the servlet context. Possibly already registered?
环境信息
- Eclipse IDE(最新版本)
- Java 17
- Tomcat 10
- Spring Boot 3.1.3
- Maven
解决方案
1. 拆分启动类与ServletInitializer
问题根源是启动类GaTomcat05w同时继承ServletInitializer并标记@SpringBootApplication,导致外部Tomcat部署时Spring上下文重复初始化,触发Filter重复注册。
修改启动类,移除对ServletInitializer的继承:
package com.azienda; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class GaTomcat05w { public static void main(String[] args) { SpringApplication.run(GaTomcat05w.class, args); } }
独立的ServletInitializer保持原有代码不变:
package com.azienda; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(GaTomcat05w.class); } }
2. 验证依赖配置(可选)
确认Tomcat相关依赖的scope为provided(当前pom已正确配置),同时为JSTL依赖指定明确版本,避免版本不一致问题:
<!-- JSTL 依赖 --> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency>
3. 清理缓存并重新部署
- 删除Tomcat安装目录下的
work和temp文件夹,清理残留缓存 - 执行
mvn clean package重新生成WAR包 - 将新WAR包部署到Tomcat的
webapps目录,启动Tomcat
原理说明
外部Tomcat部署Spring Boot WAR时,会通过ServletInitializer加载Spring上下文;而启动类继承ServletInitializer后,@SpringBootApplication会再次触发上下文初始化,导致ErrorPageFilter等Bean被重复注册,抛出IllegalStateException。拆分两者后,外部Tomcat仅通过ServletInitializer初始化上下文,内嵌Tomcat通过启动类正常启动,避免冲突。
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

