Spring Boot项目打包WAR部署Tomcat报404问题排查
我有一个基于Spring Boot 2.4、Java 8的项目,以.jar包形式配合嵌入式Tomcat 10运行完全正常。但将其改为.war包部署到独立Tomcat应用服务器后出现404错误,请问还需要进行哪些额外配置?
我的主类代码如下:
@ComponentScan("com.example.testproject") @SpringBootApplication @EnableSwagger2 @Slf4j @EnableAutoConfiguration public class ApplicationStarter extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return configureApplication(builder); } public static void main(String[] args) { SpringApplication app = new SpringApplication(ApplicationStarter.class); app.setBannerMode(Banner.Mode.OFF); app.run(args); } private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) { return builder.sources(ApplicationStarter.class); } }
我已添加的配置/依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <groupId>com.example</groupId> <artifactId>testproject</artifactId> <version>0.0.1-testproject</version> <packaging>war</packaging> <!-- 之前是jar,配合嵌入式Tomcat可正常运行 -->
针对Spring Boot 2.4项目打包为war部署到独立Tomcat出现404的问题,你需要检查并补充以下配置:
1. 调整Tomcat依赖的作用域
独立Tomcat会自带Servlet容器实现,你的spring-boot-starter-tomcat依赖需要设置为provided作用域,避免打包时嵌入Tomcat相关类导致冲突:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> <!-- 让独立Tomcat提供该依赖,无需打包进war --> </dependency>
2. 匹配Tomcat版本兼容性
Spring Boot 2.4.x官方仅兼容Tomcat 9.x版本,而你之前用的嵌入式Tomcat 10.x基于Jakarta EE API,和Spring Boot 2.x依赖的Java EE API存在兼容性差异。由于你的项目用Java 8,无法升级到兼容Tomcat 10的Spring Boot 3.x,所以必须更换独立Tomcat为9.x版本。
3. 修正访问URL路径
war包部署到Tomcat后,访问路径默认需要加上war包的名称:
- 如果war包名为
testproject-0.0.1-testproject.war,接口访问URL应为http://localhost:8080/testproject-0.0.1-testproject/你的接口路径 - 若想直接通过根路径访问,将war包重命名为
ROOT.war即可
4. 简化主类配置
你的主类已经继承SpringBootServletInitializer,可以简化冗余的方法,确保上下文初始化逻辑正确:
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(ApplicationStarter.class); }
原代码中的configureApplication方法属于冗余封装,直接返回builder.sources即可。
5. 检查资源与控制器映射
- 确认控制器类的
@RequestMapping注解路径无拼写错误 - 静态资源(HTML、JS等)需放在
src/main/resources/static或src/main/resources/public目录下,确保打包时被包含进war包
6. 查看Tomcat日志定位问题
若以上配置调整后仍有404,查看Tomcatlogs目录下的localhost.log和catalina.out日志,里面会记录项目启动时的错误细节(如类加载失败、上下文初始化异常等),帮助定位具体问题。
内容的提问来源于stack exchange,提问作者007

