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

部署到外部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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 06:45:00