Spring Boot应用本地正常,部署至AWS ElasticBeanstalk后出现404错误求助
解决Spring Boot WAR包部署到AWS Elastic Beanstalk Tomcat环境的404错误
刚遇到过类似的部署问题,这几个核心点你可以逐一排查,应该能解决你的404问题:
1. 启动类缺少外部Tomcat适配配置
Spring Boot默认使用嵌入式Tomcat,部署到外部Tomcat(比如EBS的Tomcat环境)时,你的启动类必须继承SpringBootServletInitializer并重写configure方法,否则Tomcat无法正确加载Spring应用上下文,导致请求找不到对应的Controller。
修改你的启动类如下:
@SpringBootApplication public class HelloWorldApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(HelloWorldApplication.class); } public static void main(String[] args) { SpringApplication.run(HelloWorldApplication.class, args); } }
2. WAR包打包配置需调整
Maven项目:
- 在
pom.xml中明确打包方式为war:<packaging>war</packaging> - 排除嵌入式Tomcat依赖(避免和外部Tomcat版本冲突):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
Gradle项目:
- 启用WAR打包:
war { enabled = true } - 配置Tomcat依赖为编译时提供:
compileOnly 'org.springframework.boot:spring-boot-starter-tomcat'
3. Elastic Beanstalk的上下文路径问题
当你把WAR包部署到EBS的Tomcat环境时,默认会以WAR包的文件名作为上下文路径。比如你的WAR包叫hello-app.war,那正确的访问路径应该是:http://你的EB域名/hello-app/hello
如果想直接用/hello访问,有两种简单解决方式:
- 把WAR包重命名为
ROOT.war,这样Tomcat会把它作为根应用,上下文路径就是/ - 在EBS环境配置中自定义Tomcat的上下文路径(不过重命名WAR包是更快捷的方式)
4. 查看Tomcat日志排查启动异常
如果上面的配置都调整后还是404,建议去EBS控制台的Logs选项下载Tomcat的catalina.out日志,查看是否有应用启动失败的报错(比如数据库连接异常、类加载错误等)——如果Spring应用根本没启动起来,自然会返回404。
内容的提问来源于stack exchange,提问作者Anamik Adhikary
相关产品推荐
相关产品推荐

