如何解决ClassNotFoundException?

问题描述 投票:83回答:18

我试图运行Java应用程序,但收到此错误:

java.lang.ClassNotFoundException:

冒号到达后缺少类的位置。但是,我知道该位置不存在,因为该类位于其他位置。如何更新该课程的路径?它与类路径有关吗?

java class classpath classnotfoundexception
18个回答
28
投票

你的类路径被破坏了(这是Java世界中一个非常普遍的问题)。

根据您启动应用程序的方式,您需要修改-cp的参数,MANIFEST.MF中的Class-Path条目或磁盘布局。


2
投票

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


2
投票
  1. 如果您的类路径不正确,可能会发生这种情况
  2. 让我们在相同的项目名下面设置一个可序列化的类和可反序列化的类。您运行可序列化类,在特定文件夹中创建可序列化对象。现在您需要desearialized数据。与此同时,如果您更改项目的名称,它将无法正常工作。您必须先运行serializable类,然后反序列化该文件。

2
投票

如果你正在使用maven尝试maven更新所有项目并强制快照。它也会清理并重建所有类路径..它解决了我的问题..


2
投票

我已经做了

1.使缓存无效并重新启动

2.重新构建解决问题的项目


1
投票

我试图使用Process类从C#代码运行.jar。 java代码从eclipse成功运行,但它不是来自C#visual studio,甚至直接点击jar文件,它始终以ClassNotFoundException:异常停止。我的解决方案是将java程序导出为“Runnable JAR file”而不是“JAR File”。希望它可以帮助某人。


1
投票

在Java更新之后,可能会在Windows上发生这种情况,其中缺少旧版本的Java SDK并且存在新版本。我会检查你的IDE是否使用已安装的java SDK版本(IntelliJ:CTRL + SHIFT + ALT + S)


1
投票

如果您添加了多个(第三方)**库和Extends ** Application类

然后它可能会发生。

为此,你必须设置multiDexEnabled true并用Application替换扩展的MultiDexApplication类。

它将被解决。


0
投票

基本通用问题 - 最简单的通用答案;)

根据这些信息,我将假设你可能正在尝试一种基本的编码方法,构建/编译和运行一个简单的控制台应用程序,如“Hello World”,使用一些简单的文本编辑器和一些Command Shell。

在以下情形中会发生此错误:

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

换句话说,使用:

..\SomePath>java HelloWorld

附:添加文件扩展名.class会产生同样的错误。还要确保在操作系统的环境变量的PATH中有Java(JDK / JRE)bin文件夹。(查看其他帖子的详细信息)P.P.S我的假设是正确的吗?


-4
投票

将所有代码放在try块中,然后在catch块中捕获异常

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

43
投票

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

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

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

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

因此,JVM在尝试加载类定义时,从头到尾遍历类路径,查找类的定义。例如,在类路径中:

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

JVM将首先尝试查看目录类,然后在stuff.jar中查找,最后在otherstuff.jar中查找。

当您获得ClassNotFoundException时,这意味着JVM已遍历整个类路径,但未找到您尝试引用的类。像Java世界中经常遇到的解决方案是检查类路径。

您可以通过说java -cp然后是类路径来在命令行上定义类路径。在诸如Eclipse之类的IDE中,您将有一个菜单选项来指定类路径。


11
投票

这是我到目前为止发现的best solution

假设我们有一个名为org.mypackage的包,其中包含以下类:

  • HelloWorld(主类)
  • SupportClass
  • UtilClass

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

文件结构如下所示:enter image description here

当我们调用Java时,我们指定要运行的应用程序的名称:org.mypackage.HelloWorld。但是,我们还必须告诉Java在哪里查找定义包的文件和目录。因此,要启动该程序,我们必须使用以下命令:enter image description here

注意:无论您当前的位置是什么,都必须执行上面的java命令。但javac的情况并非如此。对于编译,您甚至可以直接进入.java文件的目录并直接执行javac ClassName.java


6
投票

如果您知道类的路径或包含该类的jar,则在运行它时将其添加到类路径中。您可以使用此处提到的类路径:

在Windows上

java -classpath .;yourjar.jar YourMainClass

在UNIX / Linux上

java -classpath .:yourjar.jar YourMainClass

4
投票

如果你使用maven,请尝试这些。我使用maven作为我的项目,当我做mvn clean install并尝试运行程序时,它会抛出异常。所以,我清理项目并再次运行它对我有用。

我使用eclipse IDE。

对于运行Junit测试时未找到类异常,请尝试运行mvn clean test一次。它将编译所有测试类。


3
投票

要通过命令行将类的位置添加到类路径,只需在运行时添加-cp-classpath以及类的位置。 I.E.

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

或者,如果您正在运行诸如eclipse之类的IDE,您可以右键单击project -> build path -> configure build path并将包含您的类的外部JAR添加到构建路径,然后它应该可以正常工作。


3
投票

采用 ';'作为分隔符。如果您的环境变量设置正确,您应该看到您的设置。如果您的PATH和CLASSPATH是正确的,Windows应该识别这些命令。安装Java时无需重新启动计算机。


3
投票

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

方法对我不起作用:

1)使用-cp选项和jar文件的完整路径。

2)当位于当前文件夹中时,仅使用-cp和jar的名称

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

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

这个解决方案是针对mysql-connector-java.5 - * .jar中的com.mysql.jdbc.Driver类报告的,使用OpenJDK 1.7版在linux上工作


2
投票

转到顶部并删除import语句(如果有),然后重新导入该类。但如果不是这样的话,那就干净吧。您使用的是Netbeans还是Eclipse?

© www.soinside.com 2019 - 2024. All rights reserved.