部署Spring Boot Java应用到Linux Azure App Service后访问异常排查
问题背景
按官方文档部署Spring Boot应用到Azure App Service时,先将pom.xml打包类型从JAR改为WAR,部署后访问返回404。先排查出JDK版本不兼容问题:本地用JDK18编译(类文件版本61.0),Azure初始配置JDK11(最高支持版本55.0),更换为JDK17+Tomcat10后版本错误消失,但404问题依旧。配置com.microsoft.azure:azure-webapp-maven-plugin重新部署后,应用正常访问,确认原流程缺少该插件配置是核心诱因。
核心原因分析
Azure App Service部署Java WAR应用时,若未使用官方Maven插件,需手动适配多项环境要求,而插件会自动处理这些细节:
- 上下文路径匹配:插件自动将WAR包部署到Tomcat的
webapps/ROOT目录,对应根路径访问;手动部署若未指定,WAR会以原文件名作为上下文路径(如myapp.war需通过https://<app-name>.azurewebsites.net/myapp访问) - 环境适配:自动配置Azure Tomcat的环境变量、启动参数,适配Spring Boot WAR包的运行要求
- Spring Boot特殊配置校验:确保WAR包包含继承
SpringBootServletInitializer的启动类(外部Tomcat部署Spring Boot的必要条件)
排查验证步骤
检查部署目录结构
登录App Service的SSH终端,查看/home/site/wwwroot/webapps目录:- 若原部署的WAR包未解压到
ROOT目录,而是以自定义名称存在(如Complete.war),则需通过https://<app-name>.azurewebsites.net/Complete访问,直接访问根路径会返回404 - 对比插件部署后的目录结构,确认是否存在路径差异
- 若原部署的WAR包未解压到
校验Spring Boot WAR配置
检查pom.xml和启动类:- 确认
pom.xml中继承spring-boot-starter-parent,且打包类型为war,同时排除内置Tomcat依赖(若需外部Tomcat运行):<packaging>war</packaging> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> - 确认启动类继承
SpringBootServletInitializer:@SpringBootApplication public class YourApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
- 确认
查看Tomcat访问日志
在App Service的日志系统中查看localhost_access_log.*.txt,确认请求的路径是否与部署的上下文路径匹配。若请求根路径/,但应用实际部署在/Complete上下文,就会返回404。
结论
原部署流程未使用Azure官方Maven插件,导致WAR包的部署路径、上下文配置未适配Azure App Service的Tomcat环境,即使解决了JDK版本问题,仍因路径不匹配返回404。官方插件会自动处理部署路径、环境配置等细节,确保应用在根路径正常访问。
内容的提问来源于stack exchange,提问作者tarekahf

