You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot无法在外部Apache Tomcat 10中运行的求助

排查与解决方案

核心兼容问题:Servlet API包名变更

Tomcat 10 基于 Jakarta EE 9,使用的是 jakarta.servlet.* 包名;而 Spring Boot 2.x 仍依赖传统的 javax.servlet.* 规范,两者不兼容,这是WAR部署后Spring Boot上下文无法初始化的最常见原因。

对应解决方式:

  • 若坚持使用Tomcat 10,必须升级到 Spring Boot 3.x(Spring Boot 3.x 全面迁移到Jakarta EE规范),同时确保项目所有依赖适配Jakarta包(如Spring Framework 6+)。
  • 若暂时不想升级Spring Boot,回退到 Tomcat 9(Tomcat9仍支持javax.servlet规范),与Java17兼容无问题。

额外配置检查项

如果已升级到Spring Boot3.x仍有问题,再验证以下配置:

  • pom.xml中Tomcat依赖scope:确保spring-boot-starter-tomcat的scope设为provided,避免与外部Tomcat依赖冲突:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
  • 主类configure方法实现:确认configure方法正确返回SpringApplicationBuilder,不要遗漏参数:
@SpringBootApplication
public class SpringBootCoreApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SpringBootCoreApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringBootCoreApplication.class, args);
    }
}
  • Tomcat日志细节排查:查看Tomcat的localhost.log和manager.log,搜索是否存在ClassNotFoundException类找不到错误,这类错误通常是javax/jakarta包冲突导致的。

  • WAR包结构检查:解压WAR包,确认WEB-INF/lib下没有spring-boot-starter-tomcat.jar(因scope设为provided,打包时不应包含),避免与外部Tomcat的Tomcat库冲突。


内容的提问来源于stack exchange,提问作者HuiYa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:50:38