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

Spring MVC Maven项目添加Hibernate依赖后启动失败及依赖树疑问

问题分析与解决思路

嘿,这个场景我维护老Spring MVC项目时也踩过一模一样的坑,咱们一步步捋清楚来:

为什么mvn dependency:tree没显示javax.el-api?

Maven的dependency:tree命令默认只展示compile、runtime范围的依赖,以及非可选的传递依赖。你遇到的情况大概率是下面两种之一:

  • 你添加的那个新依赖里,javax.el-api被标记为可选依赖(optional=true):这种情况下Maven不会自动将其引入项目,默认也不会在依赖树里显示,得加上-DshowOptional=true参数才能看到。
  • 或者该依赖的javax.el-api依赖范围是provided:这个范围意味着Maven认为该依赖会由运行时容器(比如你的Tomcat7)提供,所以默认不会出现在依赖树里,需要加-DshowProvided=true才能排查到。

为什么加了新依赖会报找不到javax.el.ELManager?

Tomcat7自带的EL(表达式语言)版本是2.2,而javax.el.ELManager是EL 3.0才新增的类。你添加的新依赖(或者它的传递依赖)需要用到EL 3.0的API,但Tomcat7的自带版本完全满足不了这个需求。

因为Maven默认不会把provided范围的依赖打包到项目里,也不会在依赖树里展示,所以你之前查依赖树看不到它,但运行时Tomcat提供的旧版EL又不兼容,就触发了BeanCreationException这类栈错误。

怎么解决?

  1. 先确认完整依赖关系:执行下面的命令,查看包含可选和provided范围的完整依赖树,定位到底是哪个依赖引入了EL 3.0的需求:
    mvn dependency:tree -DshowOptional=true -DshowProvided=true
    
  2. 手动添加EL 3.0依赖:在pom.xml里明确添加EL 3.0的API和实现依赖,覆盖Tomcat7自带的旧版本:
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.1-b06</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.1-b06</version>
        <scope>compile</scope>
    </dependency>
    
    把范围设为compile是为了让Maven把这些依赖打包到项目中,优先级高于Tomcat自带的EL包。
  3. 可选方案:排除传递依赖:如果找到是新添加的依赖间接引入了EL 3.0,你也可以在该依赖的配置里排除EL相关依赖,再手动添加兼容版本,但这种方式需要仔细验证兼容性,避免其他问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:45:29