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

Spring Boot应用部署War包遇404错误,Jar包运行正常求助

问题分析与解决方案

核心原因

你遇到的404问题本质是Tomcat 10与Spring Boot 2.x的API兼容性冲突:

  • Tomcat 10.1.x基于Jakarta EE 9+,所有Java EE相关包名从javax.*改为jakarta.*
  • Spring Boot 2.7.x仍基于传统Java EE 8,依赖javax.*包,两者API不兼容,导致部署后Servlet无法正常注册,从而出现404(日志无报错是因为应用启动流程未触发致命异常,但核心Web组件未初始化)

另外,Jar包能正常运行是因为Spring Boot内置的Tomcat版本为9.x(与Spring Boot 2.x完全兼容),而外部Tomcat 10是独立进程,不存在内置Tomcat的适配逻辑。

解决方案

方案1:降级Tomcat到9.x版本

这是最直接的解决方式,无需修改项目代码:

  • 下载Apache Tomcat 9.x(推荐最新稳定版,如9.0.78)
  • 停止当前Tomcat 10服务,替换为Tomcat 9
  • 重新通过Manager部署myapp.war,访问http://localhost:8080/myapp即可正常访问

方案2:修改Spring Boot项目适配Tomcat 10

若必须使用Tomcat 10,需对项目进行Jakarta API适配:

  1. 调整主类继承SpringBootServletInitializer(打War包必须配置)
    确保你的Spring Boot主类继承该类并覆盖configure方法,让外部Tomcat能正确启动Spring应用:

    @SpringBootApplication
    public class MyAppApplication extends SpringBootServletInitializer {
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(MyAppApplication.class);
        }
    
        public static void main(String[] args) {
            SpringApplication.run(MyAppApplication.class, args);
        }
    }
    
  2. 替换依赖为Jakarta兼容版本
    在pom.xml中添加Tomcat Jakarta迁移依赖,并调整Spring Boot的Tomcat依赖:

    <packaging>war</packaging>
    
    <dependencies>
        <!-- 排除默认的javax版Tomcat依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    
        <!-- 添加Jakarta版Tomcat依赖 -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>10.1.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-websocket</artifactId>
            <version>10.1.12</version>
        </dependency>
    
        <!-- 添加Jakarta EE API依赖 -->
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
  3. 迁移代码中的javax.*引用到jakarta.*
    替换项目中所有javax.servlet、javax.annotation等包路径为jakarta.servlet、jakarta.annotation

注意:该方案适配成本较高,若没有特殊需求,优先选择方案1降级Tomcat。

额外检查点

  • 确认War包部署后的上下文路径:Tomcat默认使用War包文件名(去掉.war)作为上下文路径,若你部署的是myfile.war,访问路径应为http://localhost:8080/myfile,而非/myapp(需与Jar包的上下文路径对应)
  • 检查Tomcat的webapps目录,确认War包已正确解压为myapp文件夹

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:47:22