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

Spring Boot 2 WebFlux Router Functions WAR包在独立Tomcat中路由404问题

解决Spring Boot WAR包部署到独立Tomcat 8.5.28出现404的问题

这种问题我之前帮好几个开发者排查过,核心原因大多是Spring Boot WAR包部署到独立Tomcat时的几个关键配置没踩对,咱们一步步来捋:

1. 必须让主类继承SpringBootServletInitializer

嵌入式Tomcat会自动初始化Spring上下文,但独立Tomcat需要通过这个类来引导启动Spring Boot应用。你得修改你的主启动类,重写configure方法:

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

    public static void main(String[] args) {
        SpringApplication.run(YourAppApplication.class, args);
    }
}

这个类的作用就是告诉Tomcat怎么加载Spring的应用上下文,没它的话,独立Tomcat根本认不出你的Spring Boot应用。

2. 调整Gradle的WAR打包配置

要确保两个关键点:启用WAR插件,把嵌入式Tomcat标记为providedRuntime(避免和独立Tomcat的类冲突)。修改你的build.gradle:

plugins {
    id 'org.springframework.boot' version '2.1.x' // 注意版本要匹配Tomcat 8.5,2.1.x系列适配8.5
    id 'io.spring.dependency-management' version '1.0.x'
    id 'war' // 启用WAR打包插件
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' // 嵌入式Tomcat只在开发时用,打包不包含
    // 其他业务依赖...
}

如果不把嵌入式Tomcat设为providedRuntime,WAR包里会自带Tomcat的核心类,和独立Tomcat的类加载器打架,直接导致路由无法注册。

3. 别忽略Tomcat的应用上下文路径

当你把WAR包放到Tomcat的webapps目录下,Tomcat默认会把WAR包的文件名作为应用上下文。比如你的WAR包叫myapp.war,访问路由的路径应该是http://localhost:8080/myapp/你的接口路径,而不是直接访问http://localhost:8080/你的接口路径。

如果想让应用直接部署在根路径,把WAR包改名为ROOT.war就行,这样访问路径就是http://localhost:8080/你的接口路径。

4. 查看Tomcat日志定位问题

如果上面几步都做了还是404,去Tomcat的logs目录找catalina.out或者localhost.log:

  • 如果看不到Started YourAppApplication in X seconds这类日志,说明Spring Boot应用根本没启动,大概率是类加载冲突或者依赖缺失;
  • 如果能看到启动日志,但路由还是404,检查控制器类有没有加@RestController/@Controller注解,或者主类的包扫描范围有没有覆盖到控制器(如果控制器不在主类的子包下,要在@SpringBootApplication里加scanBasePackages指定路径)。

5. 验证路由配置的正确性

比如控制器的请求映射有没有拼写错误:

@RestController
@RequestMapping("/api")
public class TestController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello World";
    }
}

确保访问路径是http://localhost:8080/应用上下文/api/hello,别漏了应用上下文或者拼错路径。

内容的提问来源于stack exchange,提问作者Vikas Parihar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:20:48