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

Spring Boot3升级遇类缺失异常,如何查找Maven依赖引用的类?

问题与解决方案

问题场景

将Maven项目升级到Spring Boot 3和Java 21后,运行时触发如下异常:

java.lang.ClassNotFoundException: javax.servlet.http.HttpServletRequest
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[?:?]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[?:?]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?]
    at java.base/java.lang.Class.forName0(Native Method) ~[?:?]
    at java.base/java.lang.Class.forName(Class.java:534) ~[?:?]
    at java.base/java.lang.Class.forName(Class.java:513) ~[?:?]
    at java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114) ~[?:?]
    ... 32 more
Wrapped by: java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present

项目未直接引用javax.servlet.http.HttpServletRequest,推测是依赖的老旧JAR包在引用该类,需要定位到具体依赖JAR进行排除或升级。

定位依赖JAR的通用方法

方法一:Maven依赖树+脚本扫描

  1. 先导出完整依赖树到本地文件:
    mvn dependency:tree -DoutputFile=dependency-tree.txt -DoutputType=text
    
  2. 用脚本遍历依赖JAR,查找目标类引用:
    适用于Linux/macOS的Shell脚本示例:
    # 从依赖树提取所有依赖坐标,逐个定位JAR并扫描
    cat dependency-tree.txt | grep -E '\[.*\]' | sed -E 's/.*\[([^:]+:[^:]+:[^:]+)\].*/\1/' | while read coord; do
      groupId=$(echo $coord | cut -d: -f1)
      artifactId=$(echo $coord | cut -d: -f2)
      version=$(echo $coord | cut -d: -f3)
      jarPath="$HOME/.m2/repository/$(echo $groupId | tr . /)/$artifactId/$version/$artifactId-$version.jar"
      if [ -f "$jarPath" ]; then
        # 解压JAR并扫描类文件中的字符串引用
        unzip -p "$jarPath" '*.class' | strings | grep -q "javax.servlet.http.HttpServletRequest" && echo "目标类引用在:$jarPath"
      fi
    done
    
    Windows环境可以用PowerShell编写类似逻辑,或者手动用压缩工具解压依赖JAR,搜索类文件中的字符串。

方法二:IDE内置依赖分析工具

IntelliJ IDEA

  1. 打开项目后,按Ctrl+Shift+F调出全局搜索框,输入javax.servlet.http.HttpServletRequest。
  2. 在搜索选项中勾选Include non-project items,点击搜索。
  3. 搜索结果里会列出所有引用该类的文件,右键结果选择Show in Explorer就能直接定位到对应的依赖JAR。
  4. 也可以通过File > Project Structure > Libraries查看所有依赖,逐个检查JAR包含的类。

Eclipse

  1. 打开Search > File Search,输入目标类名。
  2. 在File name patterns中填写*.class,勾选Search archived resources(搜索归档资源),点击搜索。
  3. 结果会显示包含该类引用的JAR包,直接点击即可查看位置。

方法三:JDK自带工具jdeps

用JDK内置的jdeps工具分析单个依赖JAR的依赖关系:

# 替换path/to/dependency.jar为实际的依赖JAR路径
jdeps -s path/to/dependency.jar | grep javax.servlet

该命令会输出JAR依赖的模块/包,快速定位依赖javax.servlet的JAR。

后续处理建议

Spring Boot 3已将原javax命名空间的API迁移到jakarta(比如jakarta.servlet.http.HttpServletRequest),所以找到依赖旧API的JAR后:

  • 优先升级该依赖到支持Jakarta EE 9+的版本;
  • 如果无法升级,可在pom.xml中通过<exclusions>标签排除该老旧依赖,再引入兼容的替代包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:52:34