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的主要内容,如果未能解决你的问题,请参考以下文章