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

Tomcat 10部署Spring Boot 3 WAR时路径重复致404问题求助

Spring Boot 3 WAR部署Tomcat 10出现404问题排查与解决

问题背景

将Spring 6应用迁移至Spring Boot 3,已完成XML配置到注解的替换,打包为WAR部署到Tomcat 10后,应用启动日志显示正常,但访问http://localhost:8080/war-name-1.0.0时出现404错误。

关键日志信息

2023-02-23T16:02:51.284+05:30  INFO 10708 --- [nio-8989-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-02-23T16:02:51.285+05:30  INFO 10708 --- [nio-8989-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
2023-02-23T16:02:51.307+05:30  WARN 10708 --- [nio-8989-exec-2] o.s.web.servlet.PageNotFound             : No mapping for GET /war-name-1.0.0/war-name-1.0.0/
2023-02-23T16:02:51.308+05:30 ERROR 10708 --- [nio-8989-exec-2] o.s.b.w.servlet.support.ErrorPageFilter  : Cannot forward to error page for request [/index.html] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false

当前配置与代码

配置文件内容

spring.jmx.enabled=true
server.port = 9292

主类代码

@SpringBootApplication
public class MyApplication {
   public static void main(String[] args) {
       try {
           SpringApplication app = new SpringApplication(MyApplication.class);
           app.run(args);
       } catch(Throwable ex) {
           ex.printStackTrace();
       }
   }
}

Servlet初始化器代码

public class MyServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyApplication.class);
    }
}

问题分析

  1. 路径重复问题:日志中No mapping for GET /war-name-1.0.0/war-name-1.0.0/说明请求路径出现重复的上下文名称,大概率是应用内部配置与Tomcat部署上下文冲突导致。
  2. 无效端口配置:server.port = 9292在外部Tomcat部署场景下完全无效,容器端口由Tomcat自身server.xml配置决定,应用上下文路径默认是WAR包文件名。
  3. 缺少根路径映射:应用未对根路径/配置请求处理逻辑,导致访问上下文根时找不到对应映射。

解决步骤

  1. 移除无效端口配置:删除配置文件中的server.port = 9292,避免与Tomcat端口配置混淆。
  2. 添加根路径请求映射:创建基础控制器处理根路径请求,示例代码如下:
    @Controller
    public class HomeController {
        @GetMapping("/")
        public String home() {
            // 返回index页面或直接返回响应内容
            return "index";
        }
    }
    
    若为REST接口,可改用@RestController+@GetMapping("/")返回字符串响应。
  3. 确认WAR打包配置:使用Maven时,确保pom.xml正确配置WAR打包并排除内置Tomcat:
    <packaging>war</packaging>
    
    <dependencies>
        <!-- 排除内置Tomcat,依赖外部容器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
  4. 验证Servlet初始化器:确保MyServletInitializer与主类MyApplication在同一包下,或被Spring组件扫描覆盖,保证应用能正常初始化。
  5. 重新部署测试:重新打包WAR文件替换Tomcatwebapps目录下的旧文件,重启Tomcat后访问http://localhost:8080/war-name-1.0.0即可正常访问。

内容的提问来源于stack exchange,提问作者suhail ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:15:42