Tomcat部署SpringBoot服务请求静态资源报AbstractMethodError求助
问题分析与解决方案
从错误日志可以定位核心问题:
java.lang.AbstractMethodError: Method org/apache/catalina/connector/ResponseFacade.setContentLengthLong(J)V is abstract
日志里的catalina.jar:7.0.99说明实际运行环境是Tomcat7,但你部署的SpringBoot 2.5.x(对应spring-web 5.3.9)依赖Servlet API 4.0,而Tomcat7仅支持Servlet 3.0规范——setContentLengthLong是Servlet 3.1才新增的方法,Tomcat7的ResponseFacade类未实现该方法,导致调用时抛出抽象方法错误。
解决步骤
方案1:确认并使用兼容的Tomcat版本
如果目标是用Tomcat8部署:
- 检查服务器上的Tomcat实际版本,确保是Tomcat8.5.x(Tomcat8.0支持Servlet3.1,8.5版本更稳定),避免误装成Tomcat7。
- 修正pom.xml中排除内嵌Tomcat的配置,同时添加Tomcat Servlet API依赖(设为
provided,避免打包到war包中):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入Tomcat8.5的Servlet API,由容器提供实现 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>8.5.81</version> <scope>provided</scope> </dependency>
- 重新执行
mvn clean package生成war包,部署到Tomcat8.5中运行。
方案2:降级SpringBoot版本适配Tomcat7
如果必须使用Tomcat7:
- 将SpringBoot版本降级到1.5.x系列(SpringBoot 1.5.x最高支持Tomcat7,对应Servlet3.0规范),修改pom.xml中的父依赖:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.22.RELEASE</version> <relativePath/> </parent>
- 移除之前添加的Tomcat Servlet API依赖,SpringBoot 1.5.x默认依赖的Servlet API版本与Tomcat7兼容。
- 重新打包部署到Tomcat7即可。
额外注意
- 无需修改Tomcat的
server.xml文档根路径,SpringBoot的静态资源访问由自身的ResourceHttpRequestHandler处理,修改容器文档根会导致资源路由冲突。 - 可执行
mvn dependency:tree排查项目依赖树,确保没有引入Tomcat7相关的jar包。
内容的提问来源于stack exchange,提问作者Green 绿色
相关产品推荐
相关产品推荐

