如何解决ClassNotFoundException?

我试图运行一个Java应用程序,但得到这个错误:

java.lang.ClassNotFoundException:

冒号之后是缺失类的位置。 不过,我知道那个地方不存在,因为这个地方是其他地方的。 我如何更新该类的path? 这与class级路线有什么关系吗?

你的classpath被破坏了(这在Java世界是一个非常普遍的问题)。

根据您如何启动应用程序,您需要修改参数-cp ,MANIFEST.MF中的类path条目或磁盘布局。

类path是从中加载类的位置的列表。

这些“位置”可以是目录或jar文件。

对于目录,JVM将按照预期的模式加载一个类。 如果在我的类path中有目录C:/ myproject / classes ,并且尝试加载类com.mycompany.Foo ,它将在类目录下查找一个名为com的目录,然后在该目录下的一个名为mycompany的目录中最后它会在该目录中查找一个名为Foo.class的文件。

在第二个例子中,对于jar文件,它将search那个类的jar文件。 实际上,一个jar文件只是上面的一个压缩的目录集合。 如果你解压缩一个jar文件,你会得到一堆目录和类文件,遵循上面的模式。

所以当JVM尝试加载类定义时,它从头到尾遍历一个类path,寻找类的定义。 例如,在类path中:

C:/ myproject的/类; C:/myproject/lib/stuff.jar; C:/myproject/lib/otherstuff.jar

JVM将首先尝试查找目录 ,然后在stuff.jar中 ,最后在othertuff.jar查找

当你得到一个ClassNotFoundException时,这意味着JVM遍历了整个类path,而没有find你想要引用的类。 Java解决scheme经常在Java世界中检查你的类path。

你可以在命令行中定义一个类path,通过说java -cp然后是你的类path。 在Eclipse等IDE中,您将有一个菜单选项来指定您的类path。

这是迄今为止我find的最好的解决scheme 。

假设我们有一个名为org.mypackage包含类的包:

  • HelloWorld(主类)
  • SupportClass
  • UtilClass

并且定义这个包的文件被存储在目录D:\myprogram (在Windows上)或/home/user/myprogram (在Linux上)下。

文件结构如下所示: 在这里输入图像描述

当我们调用Java时,我们指定要运行的应用程序的名称: org.mypackage.HelloWorld 。 但是,我们还必须告诉Java在哪里查找定义我们包的文件和目录。 所以要启动程序,我们必须使用下面的命令: 在这里输入图像描述

注意:不pipe你当前的位置是什么,你都必须执行上面的java命令。 但是这不是javac的情况。 编译你甚至可以直接进入你拥有.java文件的目录,直接执行javac ClassName.java

如果您知道类或包含该类的jar的path,那么在运行它的时候将其添加到类path中。 您可以使用这里提到的类path:

在Windows上

 java -classpath .;yourjar.jar YourMainClass 

在UNIX / Linux上

 java -classpath .:yourjar.jar YourMainClass 

要通过命令行将类的位置添加到类path,只需在运行时添加-cp-classpath以及该类的位置即可。 IE

 java -cp "c:/location/of/file" YourProgram 

或者如果你正在运行一个像eclipse这样的IDE,你可以右键单击project -> build path -> configure build path ,并将包含你的类的外部JAR添加到构buildpath,那么它应该工作正常。

使用 ';' 作为分隔符。 如果你的环境variables设置正确,你应该看到你的设置。 如果你的PATH和CLASSPATH是正确的,windows应该识别这些命令。 安装Java时不需要重新启动计算机。

取决于你的项目。 我使用maven为我的项目,当我做“mvn干净安装”,并尝试运行一个程序,它会引发exception。 所以,我清理项目,并再次运行,它适用于我。

我使用Eclipse的IDE。

运行Junittesting时,对于Class Not Foundexception

尝试运行“mvn clean test”一旦它将编译所有的testing类(为我工作)

将jar文件的完整path添加到CLASSPATH。 在linux中使用: export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH" 。 其他方式工作(不编辑CLASSPATH)解压缩当前项目文件夹中的jar。

方式不适合我:

1)使用带有完整path的jar文件的-cp选项。

2)使用-cp ,只有位于当前文件夹中的jar名称

3)将jar复制到当前的项目文件夹

4)将jar复制到java jars的标准位置(/ usr / share / java)

这个解决scheme是在mysql-connector-java.5 – *。jar中的com.mysql.jdbc.Driver类中报告的,在OpenJDK 1.7

如果存在导入语句,则转到顶部并删除该导入语句,然后重新导入该类。 但是,如果不是这样做一个干净的,然后build立。 你使用Netbeans或Eclipse?

我遇到了这个,并尝试了所有其他解决scheme。 我的HTML文件夹中没有.class文件,只有.java文件。 一旦我添加.class文件,程序工作正常。

  1. 如果你的类path不正确,可能会发生这种情况

  2. 让我们在相同的项目名下放置一个可序列化的类和反序列化的类。 您运行可序列化的类,在特定的文件夹中创build一个可序列化的对象。 现在,您需要使用已删除的数据。 同时,如果您更改项目的名称,将无法正常工作。 您必须先运行可序列化的类,然后反序列化文件。

如果您正在使用maven,请尝试更新所有项目并强制创build快照。 它将清理以及重build所有类path。它解决了我的问题..

把所有的代码放在try块中,然后在catch块中捕获exception

 try { // code } catch(ClassNotFoundException e1) { e1.getmessage(); }