0

0

怎么处理Java中的ClassNotFoundException_类加载路径与依赖排查

P粉602998670

P粉602998670

发布时间:2026-03-11 01:35:15

|

317人浏览过

|

来源于php中文网

原创

classnotfoundexception 是 jvm 在运行时类加载器路径中未找到指定类的字节码文件,与代码拼写无关,只取决于实际 classpath 中是否存在对应 jar 或 class 文件。

怎么处理java中的classnotfoundexception_类加载路径与依赖排查

ClassNotFoundException 到底是哪个类找不到

这个异常不是说“某个类名拼错了”,而是 JVM 在当前类加载器的路径里,压根没找到你 newClass.forName() 那个类的字节码文件。它不关心你代码写得对不对,只认路径和 jar 包里的实际存在性。

常见错误现象:java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper,但你明明加了 jackson-databind 依赖——问题往往出在:它被另一个依赖排除了、版本冲突导致没拉下来、或者打包时被 Maven Shade 插件删掉了。

  • 先用 mvn dependency:tree -Dverbose 看真实引入链,搜关键字确认该类所在 jar 是否真在依赖树里
  • 如果是 Spring Boot 项目,检查 spring-boot-maven-pluginrepackage 是否把依赖打进 fat jar;没打进去的话,运行时自然找不到
  • IDE 运行没问题但命令行 java -jar 报错?说明 IDE 自动把 classpath 拼全了,而你没给 -cp 或 MANIFEST.MF 缺少 Class-Path 条目

Maven 里 scope=provided 导致运行时报 ClassNotFoundException

provided 的意思是“编译时需要,但运行时由容器(比如 Tomcat、JDK)提供”。一旦你把它用在非容器环境(如本地 main 方法、JUnit 测试、Spring Boot 内嵌容器),就会直接炸——因为编译通过了,但运行时 classpath 里根本没有那个 jar。

典型场景:写了个 WebFilter,依赖 servlet-api,pom 里写成 <scope>provided</scope>,然后用 mvn exec:java 启动测试类,立刻报 ClassNotFoundException: javax.servlet.Filter

立即学习Java免费学习笔记(深入)”;

Notion Sites
Notion Sites

Notion 推出的AI网站构建工具,允许用户将 Notion 页面直接发布为完整网站。

下载
  • 本地开发调试时,临时改成 compile 或删掉 <scope></scope>(默认就是 compile)
  • 如果必须保留 provided,就改用 mvn spring-boot:run 启动(Spring Boot 会自动补全 servlet 相关类)
  • 别在 test scope 下依赖 provided 依赖——test 不会继承 provided,得显式再声明一遍

自定义 ClassLoader 加载类时 ClassNotFoundException 的隐性原因

当你手动调用 MyClassLoader.loadClass("xxx.Yyy"),即使 jar 在磁盘上,也可能抛 ClassNotFoundException:不是路径错,而是父委托机制没走通,或双亲委派被绕过但资源路径没配对。

比如用 URLClassLoader 加载一个外部 jar,但忘了把它的 URL 加进构造参数;或者用了 Thread.currentThread().getContextClassLoader(),而它被上游框架(如某些 RPC 框架)悄悄替换成一个只加载特定包的 loader。

  • 打印 getClassLoader().getResource("xxx/Yyy.class"),返回 null 就说明 loader 根本没看到这个类路径
  • 不要假设当前线程的 context classloader 和你期望的一样——尤其在异步线程、定时任务、Dubbo/Feign 回调里,它经常是 AppClassLoader 或空的
  • 如果要跨 loader 加载类,确保目标类的 package 路径在 loader 的 URL[] 中可访问,且没被 SecurityManager 拦截(Java 8+ 默认无,但某些容器有)

Jar 包内嵌依赖未解压导致 ClassNotFoundException

有些工具(比如老版本 maven-assembly-plugin)会把依赖 jar 打成 zip 压缩包塞进主 jar 的 lib/ 目录下,而不是展开成 class 文件。JVM 默认只认顶层 jar 或 classpath 上的独立 jar,不认识 “jar 里的 jar”。

现象是:java -jar app.jar 启动后报 ClassNotFoundException,但用 jar -tf app.jar | grep xxx 发现对应类确实存在——只是藏在 lib/xxx.jar 里面,没被加载。

  • 改用 spring-boot-maven-pluginshade 插件,它们默认会把依赖解压合并到主 jar 的 BOOT-INF/classes/
  • 如果坚持用 assembly,配置 <descriptorref>jar-with-dependencies</descriptorref>,并确保 <archive></archive> 里设置了 manifestEntriesClass-Path 指向 lib 下每个 jar(注意路径是相对 jar 包根目录的)
  • 运行时用 java -cp "app.jar:lib/*" MainClass 替代 -jar,让 JVM 主动扫描 lib 下所有 jar

最常被忽略的是:你以为 Maven 依赖都进了 classpath,其实它只管编译期;运行期 classpath 是另一套逻辑,且不同启动方式(IDE / java -jar / java -cp / docker entrypoint)之间差异极大。查不到类时,第一反应不该是“是不是少加依赖”,而是“此刻 JVM 真正看到的 classpath 是什么”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

117

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

173

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

170

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

158

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

200

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

244

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

169

2024.02.23

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 80万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号