Maven打包运行Jar报错:找不到jakarta.servlet.http.HttpServletRequest Bean
问题分析与解决办法
核心问题点
- 依赖scope配置错误:你使用的
jakarta.servlet-api设置了<scope>provided</scope>,这个配置意味着该依赖会由Tomcat、Jetty这类Servlet容器提供,但直接用java -jar运行Jar时,没有Servlet容器支撑,所以运行时会找不到该类。 - 注入方式不符合规范:
HttpServletRequest是HTTP请求上下文专属对象,只能在处理请求的方法中获取,不能直接通过@Autowired注入到普通类的字段里,Spring启动时无法找到对应的Bean实例。
具体解决步骤
1. 调整依赖配置
如果是Spring Boot Web项目,不要直接引入jakarta.servlet-api,改用Spring Boot的Web starter,它会自动管理Servlet相关依赖和内置容器:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 无需手动指定版本,Spring Boot父依赖会统一管控 --> </dependency>
若必须手动引入jakarta.servlet-api,根据运行场景调整scope:
- 打包为可直接运行的Jar(依赖内置容器):删除
<scope>provided</scope>; - 打包为War部署到外部容器:保留
<scope>provided</scope>。
2. 正确获取HttpServletRequest
不要直接往类字段注入,改用以下两种合规方式:
- Controller方法中直接作为参数传入:
@RestController @RequestMapping("/demo") public class DemoController { @GetMapping("/test") public String test(HttpServletRequest request) { // 直接使用request对象 return request.getRequestURI(); } }
- 通过
RequestContextHolder动态获取:
若需在非Controller类中使用,通过请求上下文获取:
public class DemoService { public String getCurrentRequestUri() { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes != null) { HttpServletRequest request = attributes.getRequest(); return request.getRequestURI(); } return null; } }
注意:该方式仅在当前线程处于HTTP请求上下文时有效,非请求场景下会返回null。
3. 修正Maven命令顺序
你之前的命令顺序有误,正确的清理打包命令是:
mvn clean package
如需将包安装到本地仓库,使用:
mvn clean install
额外检查项
- 确认项目类型:如果是普通Java项目,无需Servlet依赖,检查是否误引入;
- 检查启动方式:若用普通Main方法启动但未加载Web上下文,Spring无法创建
HttpServletRequest相关Bean。
内容的提问来源于stack exchange,提问作者0xD1x0n
相关产品推荐
相关产品推荐

