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

Tomcat 8.5.85部署Spring Boot WAR包出现404错误求助

Spring Boot WAR包部署Tomcat后404问题排查

我尝试在Tomcat服务器上部署一个简单的Spring Boot项目,本地通过IntelliJ IDEA运行一切正常。将WAR包放入Tomcat的/webapps目录后,在管理界面能看到项目,但访问所有预期路径都返回404,预期在http://localhost:8081/spring-mvc/index看到绿色的"Hello, World"。系统为基于Ubuntu 22.04 LTS的Pop!_OS,Tomcat和项目均使用OpenJDK 19。

提供的代码

RestController代码

@RestController
@RequestMapping("/spring-mvc")
public class HomeController {

    @GetMapping("/index")
    public String homePage() {
        return "<p style='color: green;'>Hello, World</p>";
    }
}

主类代码

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Main extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Main.class);
    }
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.2</version>
        <relativePath/> 
    </parent>
    <groupId>com.visionthing</groupId>
    <artifactId>spring-mvc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-mvc</name>
    <packaging>war</packaging>
    <properties>
        <java.version>19</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>6.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>3.0.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>spring-mvc</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

问题排查与解决方法

1. 检查Tomcat版本兼容性

Spring Boot 3.0.x依赖Jakarta EE 9(Servlet API 6.0),要求Tomcat版本必须是10.0.x及以上。如果使用Tomcat 9或更低版本,会因API不兼容导致项目无法初始化,直接返回404。

2. 修复pom.xml配置问题

  • 移除冗余依赖:
    • 删除spring-webmvc依赖:spring-boot-starter-web已包含该依赖,重复添加可能引发版本冲突。
    • 删除spring-boot-maven-plugin的dependencies配置:该插件属于构建插件,仅需在build/plugins中配置即可。
  • 修正编译版本:项目指定Java 19,但maven-compiler-plugin配置的source/target为1.8,会导致字节码版本不匹配。修改为:
    <configuration>
        <source>19</source>
        <target>19</target>
    </configuration>
    
  • 替换javax依赖为jakarta:Spring Boot 3.x不再支持javax包,将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>
    
  • 排除内置Tomcat:外部Tomcat部署时,需排除Spring Boot内置Tomcat,并添加Tomcat Servlet API依赖(提供范围,避免打包进WAR):
    <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>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet-api</artifactId>
        <version>10.1.5</version> <!-- 匹配你的Tomcat版本 -->
        <scope>provided</scope>
    </dependency>
    

3. 验证访问路径

项目上下文路径为spring-mvc(由WAR包名决定),Controller的@RequestMapping为/spring-mvc,所以完整访问路径应为http://localhost:8081/spring-mvc/spring-mvc/index。若想简化路径,可在application.properties中配置全局上下文路径:

server.servlet.context-path=/spring-mvc

同时将Controller的@RequestMapping改为/,此时访问路径变为http://localhost:8081/spring-mvc/index。

4. 查看Tomcat日志

检查Tomcat的logs/catalina.out或localhost.log日志,确认项目启动时是否有类加载失败、依赖冲突、初始化异常等错误,这些都会导致项目无法正常提供服务。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:45:28