Tomcat 8.5.85部署Spring Boot WAR包出现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

