NoClassDefFoundError/ClassNotFoundException/Illegal access
Posted Z2Min_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NoClassDefFoundError/ClassNotFoundException/Illegal access相关的知识,希望对你有一定的参考价值。
NoClassDefFoundError
错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。
原因(部分考虑方向):
- jar包冲突排包的时候不小心排掉了
- 类冲突,不同的jar包中含有相同的该类,不知道调用哪一个了
- 低版本的jdk运行了高版本编译的class类
java.lang.NoClassDefFoundError: org/apache/zookeeper/server/ZooTrace
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1155) ~[zookeeper-3.3.1.jar:3.3.1-942149]
Caused by: java.lang.ClassNotFoundException: Illegal access: this web application instance has been stopped already. Could not load [org.apache.zookeeper.server.ZooTrace]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
今天遇到的这个问题,以上三个方向排查后都不符合,然后看到了网上有一篇文章说:
==tomcat重启的时候,因为之前的tomcat中的线程还没有完全关闭,新启动tomcat就会报这个异常。==
学习了!!
Tomcat运行时异常:Illegal access: this web application instance has been stopped already.
再来了解一下 NoClassDefFoundError和ClassNotFoundException区别
- NoClassDefFoundError 发生在 JVM 运行时,根据提供的类名,在 classpath 中找到对应的类进行加载,但是当它找不到这个类时,就会出现此错误;
- ClassNotFoundException 是在编译的时候,在 classpath 中找不到对应的类,发生的异常。
疑问?
运行之前不都要编译的吗?
编译之前如果没有找到某个类就会报错;
为啥还要等到运行的时候???
jar包引用
eg:A系统引用了C jar包,现在B系统要引用A系统,把A系统打成jar包,让B系统引用。
当B系统引入了 A jar包,但没有成功引用C jar包,编译的时候,Maven会放过,不会报异常,
再当B系统运行时,发现找不到某个类,此时,会报 NoClassDefFoundError
。
以上是关于NoClassDefFoundError/ClassNotFoundException/Illegal access的主要内容,如果未能解决你的问题,请参考以下文章