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

Java17+Tomcat10.1的Spring Web应用启动报错:无Spring Boot依赖却出现Jersey类异常

问题

使用Java 17 + Tomcat 10.1搭建Spring Web应用,通过mvn dependency:tree确认项目无直接Spring Boot依赖,但启动Tomcat时抛出AbstractMethodError异常,提示org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration$JerseyWebApplicationInitializer未实现org.springframework.web.WebApplicationInitializer接口的onStartup(jakarta.servlet.ServletContext)方法,导致启动失败。

报错信息

Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/myapp]]
    at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:878)
    ... 21 more
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/myapp]]
    at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:871)
    ... 21 more
Caused by: java.lang.AbstractMethodError: Receiver class org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration$JerseyWebApplicationInitializer does not define or inherit an implementation of the resolved method 'abstract void onStartup(jakarta.servlet.ServletContext)' of interface org.springframework.web.WebApplicationInitializer.
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4882)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    ... 27 more

May 12, 2023 4:53:16 AM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-nio-8082"]
May 12, 2023 4:53:16 AM org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service [Catalina]
May 12, 2023 4:53:16 AM org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["http-nio-8082"]

pom.xml依赖片段

...
<spring.version>6.0.8</spring.version>
...
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${spring.version}</version>
</dependency>       
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>${spring.version}</version>
</dependency>
解决方案

问题根因

Spring 6 和 Tomcat 10.1 基于**Jakarta EE 9+**规范,使用jakarta.servlet包;而JerseyAutoConfiguration$JerseyWebApplicationInitializer来自Spring Boot的autoconfigure模块,该类是基于旧的javax.servlet规范实现的。两者API包名不兼容,导致Spring Web的WebApplicationInitializer接口要求的onStartup(jakarta.servlet.ServletContext)方法无法被该类实现,从而抛出AbstractMethodError。

即使mvn dependency:tree没显示直接依赖,也可能是某个第三方依赖间接引入了spring-boot-autoconfigure包。

解决步骤

  1. 精准排查间接依赖
    执行以下命令,找出所有引入Spring Boot相关包的依赖:

    mvn dependency:tree -Dincludes=org.springframework.boot
    

    该命令会过滤出所有与Spring Boot相关的依赖链路,帮你定位是哪个依赖带进来的spring-boot-autoconfigure。

  2. 排除Spring Boot autoconfigure依赖
    在找到的依赖中,添加排除规则,移除spring-boot-autoconfigure:

    <dependency>
        <!-- 替换成你找到的依赖的groupId和artifactId -->
        <groupId>xxx</groupId>
        <artifactId>xxx</artifactId>
        <version>xxx</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-autoconfigure</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  3. 验证打包结果
    打包WAR包后,检查WEB-INF/lib目录,确保没有spring-boot-autoconfigure-*.jar文件,避免依赖残留。

  4. 确认自定义初始化类规范
    如果你自己实现了WebApplicationInitializer,确保它实现的是Spring 6版本的org.springframework.web.WebApplicationInitializer接口,方法参数为jakarta.servlet.ServletContext,而非旧版的javax.servlet.ServletContext。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:34:55