首页 > 其他分享 >NoClassDefFoundError原因排查

NoClassDefFoundError原因排查

时间:2022-11-29 10:46:14浏览次数:75  
标签:java 错误 classpath NoClassDefFoundError jar 排查 原因 加载

NoClassDefFoundError错误发生的原因

 NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。例如在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,此时Java虚拟机就会抛出NoClassDefFoundError错误。与ClassNotFoundException的不同在于,这个错误发生只在运行时需要加载对应的类不成功,而不是编译时发生。很多Java开发者很容易在这里把这两个错误搞混。

简单总结就是,NoClassDefFoundError发生在编译时对应的类可用,而运行时在Java的classpath路径中,对应的类不可用导致的错误。

NoClassDefFoundError和ClassNotFoundException区别

我们经常被java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError这两个错误迷惑不清,尽管他们都与Java classpath有关,但是他们完全不同。NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError的错误,而ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的错误。ClassNotFoundException比NoClassDefFoundError容易解决,是因为在编译时我们就知道错误发生,并且完全是由于环境的问题导致。而如果你在J2EE的环境下工作,并且得到NoClassDefFoundError的异常,而且对应的错误的类是确实存在的,这说明这个类对于类加载器来说,可能是不可见的。

引起NoClassDefFoundError错误的原因

1.查看否存在jar冲突,版本不一致问题,即同一个Jar包出现了多个不同版本,并选择了错误的版本而导致JVM加载不到需要的类或加载了错误版本的类;
2.jdk版本不一致,即排查是否存在不同环境jdk版本不一致问题,例如在测试环境正常,生产环境不正常;
3.PATH或CLASS PATH设置有误,这种一般是第一次运行应用,并且所有类都会报此问题;
4.jar包(应用包损坏),确实不存在对应的class文件;
5.其它相关的包有依赖关系没有加到lib中,也即查看对应的应用包中是否存在对应的class文件,查看maven的jar引用配置;
6.如果你工作在J2EE的环境,有多个不同的类加载器,也可能导致NoClassDefFoundError;
7.同一台服务器的其它系统也使用了相关的包并且版本不同,而且是加在classpath或PATH里面的,系统调用的时候先找到了那个jar包;
8.内存不足,maxPermSize或MaxMetaspaceSize设定值过小而加载的类增多引起的,即需要调整相关JVM参数;
9.一种情况就是因为静态变量加载不到原因,即需要加载的类是不是写的有问题,查看具体源码;NoClassDefFoundError也可能由于类的静态初始化模块错误导致,当你的类执行一些静态初始化模块操作,如果初始化模块抛出异常,哪些依赖这个类的其他类会抛出NoClassDefFoundError的错误。如果你查看程序日志,会发现一些java.lang.ExceptionInInitializerError的错误日志,
ExceptionInInitializerError的错误会导致java.lang.NoClassDefFoundError: Could not initialize class
10.可能程序的启动脚本覆盖了原来的classpath环境变量

排查的方法记录

查找jar包是否存在、引用某个类的命令

find ./ -name “*.jar” | xargs grep “xxx”

查看加载了什么类

java -verbose -jar data-rtc-manage-1.0.0.jar

也可以使用 arthas 进行排查

 

参考:
https://blog.csdn.net/weixin_30709809/article/details/97441769
https://yanglinwei.blog.csdn.net/article/details/126322284

 

标签:java,错误,classpath,NoClassDefFoundError,jar,排查,原因,加载
From: https://www.cnblogs.com/wjqhuaxia/p/16934651.html

相关文章

  • 针对段错误排查
    一、发生段错误情况分类访问不存在的内存访问系统保护的内存指针操作越界(包括数组)二、GDB调试出现Coredump出现的汇编代码GDB显示汇编GDB如何通过layouta......
  • EasyGBS平台H.265视频转码后,内存出现异常是什么原因?
    EasyGBS平台可提供流媒体接入、处理、转发等服务,支持内网、公网的监控设备通过国标GB/T28181协议进行视频监控直播。平台可拓展性强,部署灵活,可实现的视频能力有:实时直播、视......
  • postgresql 数据库 INSERT 或 UPDATE 大量数据时速度慢的原因分析
    前言最近这段时间一直使用pg数据库插入更新大量的数据,发现pg数据库有时候插入数据非常慢,这里我对此问题作出分析,找到一部分原因,和解决办法。一死元祖过多提起pg数据库......
  • 关于为什么ip addr ,yum无法安装,防火墙失效的原因
    今天找了两个小时,  如图,有些配置配置完成之后命令丢失进不去,ping不通,多半是配置环境变量的时候直接写到最底下去了!,记得写到unset-fpathmunge下面,否则就......
  • MySql回表以及产生原因
    MySql回表以及产生原因在SQL优化里面经常提到,如在非主键索引的情况下尽量避免使用select*from;究其原因就是今天我要记录的Mysql回表查询。Mysql回表指的是在InnoDB存储......
  • WordPress程序备受喜爱的原因:十八般武艺
    众所周知,WordPress是个功能强大且颇受欢迎的开源博客平台。WordPress友好的界面和操作的简便性为它带来了无数用户,WordPress甚至可以被作为内容发布系统(CMS)来使用。当你尝试......
  • Mysql 启动报错问题排查
    报错信息1:MySQL启动报错:File./mysql-bin.indexnotfound(Errcode:13)_MySQL请检查MySQL数据目录的权限/usr/local/mysql/data  ,  errcode13,一般就是权限问题,my......
  • SMT贴片加工电子零件移位的原因
    SMT贴片加工电子零件移位的原因SMT贴片加工是由贴片、DIP插件、测试等多个流程工艺组合而成的制程工艺,每个制程工艺的作用不同,SMT贴片的工艺是目前电子PCBA产品组装Z流行的......
  • vscode配置live server不生效,原因居然是这个。
    今天想试一下vscode一个很方便的liveserver插件。 就简单写了一个demo代码,右键openwithliveserver也能正常打开浏览器,看到运行结果。然后改了内容保存,发现页面上没......
  • 性能测试中TPS上不去的几种原因浅析
    https://www.cnblogs.com/imyalost/p/8309468.html先来解释下什么叫TPS:TPS(TransactionPerSecond):每秒事务数,指服务器在单位时间内(秒)可以处理的事务数量,一般以request/se......