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包。
解决步骤
精准排查间接依赖
执行以下命令,找出所有引入Spring Boot相关包的依赖:mvn dependency:tree -Dincludes=org.springframework.boot该命令会过滤出所有与Spring Boot相关的依赖链路,帮你定位是哪个依赖带进来的
spring-boot-autoconfigure。排除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>验证打包结果
打包WAR包后,检查WEB-INF/lib目录,确保没有spring-boot-autoconfigure-*.jar文件,避免依赖残留。确认自定义初始化类规范
如果你自己实现了WebApplicationInitializer,确保它实现的是Spring 6版本的org.springframework.web.WebApplicationInitializer接口,方法参数为jakarta.servlet.ServletContext,而非旧版的javax.servlet.ServletContext。
内容的提问来源于stack exchange,提问作者ramt

