修复java.lang.NoClassDefFoundError的六种方法

8,467 阅读4分钟

本文介绍了如何修复Java中的NoClassDefFoundError的解决方案。

Java中的NoClassDefFoundError是一个奇怪的错误,可能发生在java应用程序中。

我们曾经在运行java程序时,在线程 "key "java.lang中得到异常。NoClassDefFoundError。

我在java程序中见过很多次这种异常。

解决NoClassDefFoundError的方法很简单,但我们必须首先了解如何解决它。

NoClassDefFoundError 异常可能存在于多种情况下,包括Windows、Linux、Unix和Tomcat/Websphere/JBoss。

我将解释java程序是如何抛出这个错误的,以及如何解决NoClassDefFoundError

public class HelloWorldDemo {  
 public static void main(String args[]) {  
  System.out.println("Hello world test message");  
 }  
}  

这是一个hello world程序的样本,在运行javac HelloWorld.java命令时,它的编译很好,并在当前目录下生成了HelloWorld.class。

在用java HelloWorld命令运行这个程序后,我得到了以下异常:

线程 "main "中出现异常 java.lang.NoClassFoundError:HelloWorld

线程main抛出这个错误,并异常地退出程序。

这个错误的原因是java虚拟机在运行时无法找到一个类文件。java命令检查当前目录下的类,所以如果你的类文件不在当前目录下,你就必须把它添加到classpath中,所以解决方法是把这个。在classpath中,现在有一个类文件。

classpath是每个系统中的环境变量,指向目录中的类文件。

如果你的类文件在jar文件中,jar就应该在classpath中。类的路径可以是绝对的(完整的路径),也可以是相对的(与目录有关)。

解决java.lang.NoClassDefFoundError异常的多种方法。

以下是发生该错误的不同方式和修复方法。

如何解决java.lang.NoClassDefFoundError问题

HelloWorld.class在运行时不可用,所以我们必须使用-classpath选项将该类文件设置为java命令。

这是通过为java命令内联设置classpath来修复NoClassDefFoundError错误。

我们正在指示jvm在当前目录下寻找HelloWorld.class,通过指定.classpath选项来实现。

如果类文件在不同的目录中,我们需要指定完整的目录绝对路径或相对路径,而不是为java命令指定。

java -classpath . HelloWorld

修复windows下java.lang.NoClassDefFoundError的问题

为了解决windows下的NoClassDefFoundError错误,我们必须设置CLASSPATH环境变量。

要在windows中设置类路径,我们必须配置以下值

set CLASSPATH=%CLASSPATH%;..;

%CLASSPATH%表示要添加现有的classpath,而.则指向当前目录。

设置完路径后

java HelloWorld

该命令工作正常,并打印出hello world消息

修复java.lang.NoClassDefFoundError在linux/unix中的问题

这就像在linux中设置路径
,所以我们必须将类文件的目录设置为classpath环境变量。

set $CLASSPATH=$CLASSPATH%;..;

在linux中设置classpath后,

java HelloWorld

命令工作正常,并打印出hello world消息

修复eclipse中java.lang.NoClassDefFoundError的问题

在eclipse中出现java.lang.NoClassDefFoundError通常是由于你的项目在构建路径中缺少一些必要的jars。
,我们必须首先配置你的项目构建路径。我们可以通过右击项目->属性->java构建路径->选择jars的库或文件夹中的类选择源来配置。

修复java.lang.NoClassDefFoundError的错误:-

我们还发现,当我们运行jar文件中的java类文件时,会出现java.lang.NoClassDefFoundError错误,所以你必须在eclipse的MANIFEST.MF中设置classpath:-。

Manifest-Version: 1.0  
Ant-Version: Apache Ant 1.6.2  
Created-By: 1.6.0-beta2-b86 (Sun Microsystems Inc.)  
Implementation-Title:   
Implementation-Version: 3.0  
Implementation-Vendor:   
Class-Path: exntension.jar  

你的路径中缺少class-path属性值jar,所以我们必须将jar设置到classpath中。

NoClassDefFoundError 服务器中的错误是由于jar不在classpath中。要解决这个问题,请看完整的堆栈跟踪,找到包含jar的jar,并尝试复制到服务器classpath或应用程序classpath中。如果你在服务器上看到任何问题,请留下评论。

我们已经看到NoClassDefFoundError在运行时抛出,但java.lang.ClassNotFoundException错误呢?两者看起来相似,只与classpath有关,但ClassNotFoundException异常抛出应用程序试图使用类的名称加载类或调用其他未加载的类。

什么是java.lang.ClassNotFoundException :**?

ClassNotFoundException 当类在运行时被不同的类加载器加载时,会被抛出。

在这里,加载在父类中的子类对于类加载器来说是不可用的。

java.lang.NoClassDefFoundError和java.lang.ClassNotFoundException之间有什么不同? 我们将在下面一段中看到

ClassNotFoundException和NoClassDefFoundError的区别?

两者都是在运行时无法加载, NoClassDefFoundError ,如果找不到.class文件, 而ClassNotFoundException ,只有当你试图通过ClassLoader使用class.forName或Class loader的findSystemClass方法或ClassLoader中的LoadClass来加载一个字符串名称的类时才会发生错误。

希望你能理解解决java中NoClassDefFoundError的方法。请留下评论并分享。

总结

在不同的环境下,我们有很多方法可以解决这个错误,也讨论了ClassNotFoundExceptionNoClassDefFoundError 的比较。