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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:22:29