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依赖树+脚本扫描
- 先导出完整依赖树到本地文件:
mvn dependency:tree -DoutputFile=dependency-tree.txt -DoutputType=text - 用脚本遍历依赖JAR,查找目标类引用:
适用于Linux/macOS的Shell脚本示例:
Windows环境可以用PowerShell编写类似逻辑,或者手动用压缩工具解压依赖JAR,搜索类文件中的字符串。# 从依赖树提取所有依赖坐标,逐个定位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
方法二:IDE内置依赖分析工具
IntelliJ IDEA
- 打开项目后,按
Ctrl+Shift+F调出全局搜索框,输入javax.servlet.http.HttpServletRequest。 - 在搜索选项中勾选
Include non-project items,点击搜索。 - 搜索结果里会列出所有引用该类的文件,右键结果选择
Show in Explorer就能直接定位到对应的依赖JAR。 - 也可以通过
File > Project Structure > Libraries查看所有依赖,逐个检查JAR包含的类。
Eclipse
- 打开
Search > File Search,输入目标类名。 - 在
File name patterns中填写*.class,勾选Search archived resources(搜索归档资源),点击搜索。 - 结果会显示包含该类引用的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
相关产品推荐
相关产品推荐

