Java 在类路径中替换jar后发生ClassNotFoundException

Java 在类路径中替换jar后发生ClassNotFoundException,java,jar,Java,Jar,我有一个java进程,在类路径中运行两个jar文件,即 -A.jar -B.jar 进程运行时,我用另一个B.jar替换了B.jar,并用一些文件更新了它。现在在我的过程中,我看到了一些B.jar中类的ClassNotFounds异常。我不明白这里发生了什么。我以为JAR会在java进程启动时加载。如果是这样,为什么会这样?有人能帮我吗??我知道如果我重新开始这个过程,一切都会好起来的。但我很想知道这背后的原因。JAR文件中的类是在启动时加载的,而不是在JVM启动时加载的。通过在应用程序运行时替

我有一个java进程,在类路径中运行两个jar文件,即
-A.jar
-B.jar

进程运行时,我用另一个B.jar替换了B.jar,并用一些文件更新了它。现在在我的过程中,我看到了一些B.jar中类的ClassNotFounds异常。我不明白这里发生了什么。我以为JAR会在java进程启动时加载。如果是这样,为什么会这样?有人能帮我吗??我知道如果我重新开始这个过程,一切都会好起来的。但我很想知道这背后的原因。

JAR文件中的类是在启动时加载的,而不是在JVM启动时加载的。通过在应用程序运行时替换B.jar,如果您删除了其他人引用的类,您将得到一个
ClassNotFoundException


在Java7中,如果一个已经有一段时间没有使用的类被垃圾收集,这种情况也会发生。JVM将尝试重新加载它,并发现它不再在类路径中。如果您使用的是
-XX:+cmsclasssunloadingEnabled
启动选项,则在早期版本的Java中也会发生这种情况。

JVM支持静态和动态加载类。JVM将在启动时加载所有显式链接的类,但不会“发现”在运行时动态加载的类,例如通过反射。如果您正在代码中执行
Class.forName(“org.package.mySuperClass”)
,并且如果您的
超类从来没有被其他代码链接过,那么它将在调用时加载。如果包含此类的jar在调用之前已从类路径中删除,则将抛出
ClassNotFoundException


请注意,许多现代框架使用动态加载(甚至是链接到类路径中以前未链接过的类的动态编译),很难(也不确定)知道是哪一种。

似乎是链接错误。@AakashGoyal您能启发一下吗?java.lang.NoClassFoundError和ClassNotFoundException有两种。该错误在编译期间出现,而异常将在运行时抛出。尝试重新编译,如果您得到NoClassFoundError,那么JAR就有一些问题。我猜你一定是在使用ClassLoader或Class.forName方法。我不知道确切的原因,可能是在链接阶段生成的字节码引用了某个jar(可能由校验和标识)。