Spring Boot升级至2.6.6后,外部Tomcat部署WAR包失败
问题原因
Spring Boot 2.x 与 1.5.x 在外部 Servlet 容器(如 Tomcat)部署时,对context-path配置的处理逻辑存在关键差异:
- 1.5.x 版本中,
server.context-path配置会覆盖外部容器的上下文路径(由 WAR 包名称决定),因此即使 WAR 包名为admin.war,实际上下文路径仍以 Spring Boot 的配置为准。 - 2.x 版本起,外部容器部署时,
server.servlet.context-path配置会被忽略,上下文路径完全由外部容器决定(即 WAR 包名称admin.war对应路径/admin)。此时若保留该配置,会导致 Spring Boot 内部的请求映射路径叠加容器上下文路径,出现/admin/admin/xxx这类无效路径,从而触发「No mapping found」错误。
解决方案
1. 移除外部部署时的context-path配置
直接删除application.properties中的server.servlet.context-path=/admin配置:
- 外部 Tomcat 部署时,上下文路径由 WAR 包名称决定为
/admin,控制器的@RequestMapping("/xxx")对应访问路径/admin/xxx,与 1.5.x 版本的访问逻辑一致。 - 若需本地运行 JAR 包时保留上下文路径,可通过多环境配置实现:
- 创建
application-local.properties,添加server.servlet.context-path=/admin - 本地运行时激活
local环境(如 IDE 配置spring.profiles.active=local),部署到 Tomcat 时使用默认环境即可。
- 创建
2. 确认主类配置正确
确保继承SpringBootServletInitializer的主类配置无误,示例代码:
@SpringBootApplication public class AdminApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(AdminApplication.class); } public static void main(String[] args) { SpringApplication.run(AdminApplication.class, args); } }
该配置负责在外部容器中初始化 Spring Boot 应用,需确保主类所在包能正确扫描所有控制器和配置类。
3. 适配路径匹配策略(可选)
Spring Boot 2.6.x 默认启用严格的路径匹配策略PATH_PATTERN_PARSER,若控制器路径写法(如通配符、斜杠处理)与旧版本不兼容,可添加以下配置切换回 1.5.x 使用的ANT_PATH_MATCHER:
spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER
内容的提问来源于stack exchange,提问作者Vaishali
相关产品推荐
相关产品推荐

