如何解析 ClassNotFoundException?

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

java.lang.ClassNotFoundException:

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

904751 次浏览

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

在视窗上

java -classpath .;yourjar.jar YourMainClass

在 UNIX/Linux 上

java -classpath .:yourjar.jar YourMainClass

您的类路径中断了(这是 Java 世界中 非常常见的问题)。

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

如果存在 import 语句,则上升到顶部并删除该语句,然后重新导入该类。但如果不是这样的情况下做一个清洁然后建立。您使用的是 Netbeans 还是 Eclipse?

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

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

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

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

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

对于目录,JVM 将遵循预期的加载类的模式。如果我的类路径中有目录 C:/myproject/class,并试图加载一个类 来吧,我的公司,福,它将在类目录下查找名为 Com的目录,然后在该目录下查找名为 我的公司的目录,最后在该目录下查找名为 Foo.class的文件。

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

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

C:/myproject/classes; C:/myproject/lib/stuff.jar; C:/myproject/lib/other stuff.jar

JVM 将首先尝试在目录 课程中查找,然后在 Stuff.jar中查找,最后在 其他的东西中查找。

当您得到 ClassNotFoundException 时,这意味着 JVM 已经遍历了整个类路径,但没有找到您试图引用的类。与 Java 世界中经常出现的情况一样,解决方案是检查您的类路径。

您可以在命令行上定义一个类路径,方法是先说 Java-cp,然后说您的类路径。在 Eclipse 这样的 IDE 中,您将有一个菜单选项来指定类路径。

我也遇到了这种情况,并尝试了所有其他的解决方案。我没有。在我的 HTML 文件夹中,我只有。Java 文件。一旦我添加了。类文件程序运行良好。

  1. 如果类路径不正确,就会发生这种情况

  2. 让我们假设一个可序列化的类和一个可反序列化的类在同一个项目名下。运行可序列化类,在特定文件夹中创建可序列化对象。现在您需要去序列化的数据。与此同时,如果您更改项目的名称,它将无法工作。必须首先运行可序列化类,然后反序列化文件。

使用“ ;”作为分隔符。如果您的环境变量设置正确,您应该看到您的设置。如果 PATH 和 CLASSPATH 是正确的,窗口应该能够识别这些命令。安装 Java 时不需要重新启动计算机。

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

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

如果你用 Maven 试试这个。我在我的项目中使用了 maven,当我执行 mvn clean install并尝试运行一个程序时,它会抛出异常。所以,我清理项目,再次运行它,它为我工作。

我用的是 Eclipse IDE。

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

这是我目前找到的 最佳解决方案

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

  • HelloWorld (主类)
  • 支援班
  • 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

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

这些方法对我不起作用:

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

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

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

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

这个解决方案是在 mysql-connect-java.5-* . jar 中的 com.mysql.jdbc. Driver 类中报告的,该类使用 OpenJDK version 1.7在 Linux 上工作

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

我想逃跑。使用 Process类从 C # 代码中获取 jar。Java 代码在 eclipse 中运行成功,但是没有在 C # Visual Studio 中运行,甚至直接单击 jar 文件,它总是在 ClassNotFoundException:异常时停止。对于我的解决方案,是将 java 程序导出为“ Runnable JAR File”而不是“ JAR File”。希望能帮到别人。

我刚说了

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

2. 重建我的项目解决了这个问题

这种情况可能发生在 Windows 上的 Java 更新之后,旧版本的 JavaSDK 丢失,新版本出现。我将检查您的 IDE 是否正在使用已安装的 java SDK 版本(IntelliJ: CTRL + SHIFT + ALT + S)

如果添加了多个 (第三方) * * 图书馆及其扩展 * * 应用

那就有可能。

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

会解决的。

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

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

此错误发生在下列场景中:

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

换句话说,使用:

..\SomePath>java HelloWorld

附注: 添加文件扩展名.class 会产生同样的错误。 还要确保在操作系统的 Environment Variables 的 PATH 中有 Java 的(JDK/JRE) bin 文件夹。(查找更多详细信息,其他文章) 附注: 我的假设正确吗?

如果您使用的是 maven,请检查您的 pom.xml中是否有这个插件:

    <build>
<plugins>


<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.0</version>
<executions>
<!-- Attach the shade goal into the package phase -->
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>


</plugins>
</build>

它将把依赖项(异常原因)放到 jar 中。

仅供参考: 这将包括最终 jar 中膨胀的所有依赖项

在我的例子中,作为 class not found Exception 引发的类具有与 ssl 证书相关的属性。关闭 eclipse 并以“ Run as Administrator”打开,然后问题得到解决。由于 eclipsehave 发出了相关的权限,它将抛出这种异常。

在将“ Java Language Support”插件从 Visual Studio Code 版本0.66.0升级到0.67.0之后,我开始遇到这个问题。

降级使我可以毫无问题地运行相同的代码。

如果您已经将项目移动到新机器或从 git 导入了它,那么请尝试这样做。

  1. 右击 class > Run as > Run Configuration
  2. 删除主类引用
  3. 应用 > 关闭
  4. 现在再次右键单击 class > run as java application。

这招对我很管用。

我删除了一些未使用的导入,它为我修复了问题。如果你从一开始就不去找 Class,你就不可能找不到它。

对不起,我迟到了,但我会用最简单的外行语言解释给你听。 当你输入‘ javac < Programname.java > 编译器检查程序并发现错误,首先确保您的程序与您在命令提示符中执行的程序位于同一目录中。然后它创建程序的.Class 文件。为了前任。如果我的程序名是 Test.java,那么创建的类文件应该是 Test.class,它将在下一行中执行。 有时候 java 会为你的.class 使用一些其他的名字,使用这个名字,你就会得到输出。

我在终端上运行 Java 代码,添加 Class Path 就是这样的解决方案:
> java -cp <JAR file> <JAVA Class file>
比如说, c:\code\prototype-app\target\classes>java -cp ..\prototype-app-1.0-SNAPSHOT.jar com_stree.app.DetectLabels

我的执行期函式库:
操作系统: Windows10
15.0.1
美芬: 3.8.1

我也犯了同样的错误,我花了一整天的时间才意识到这是一个依赖冲突问题:

  • 我引进了两个文库,AB;
  • AB都依赖于另一个库 C,但是 C的版本不同。假设 A依赖于 C 1.0,而 B依赖于 C 2.0;
  • B利用了一个只存在于 C 2.0中的类;
  • 然而,A在依赖关系树中是“更接近”的,所以 Maven 对 AB都使用 C 1.0,甚至没有提醒您这一点(这对我来说相当令人震惊) ;
  • 因此,当 B试图使用仅存在于 C 2.0中的类时,会抛出一个 ClassNotFoundException;

现在奇怪的事情是: 如果您在 IDE 中导航 B的代码并尝试跳转到仅存在于 C 2.0中的类,那么它将正常工作。确实已经安装了 C 2.0,而且您的 IDE 知道它,但是在运行应用程序时忽略了它。

这真的把我逼疯了。

最后我不得不将 C 2.0加入到我的 pom.xml中,这样它就可以在 C 1.0中被选择。

请参考这篇文章了解 Maven 如何选择最接近的依赖项: https://stackoverflow.com/a/63815140/7438905

您可以使用 mvn dependency:tree来可视化依赖关系树。

值得注意的是,有时 Java 会对引起问题的类撒谎。

如果 Java 试图加载依赖于 B 类的 A 类,而 B 类无法加载,那么就会出现这个错误。

在某些情况下,当问题是 B 时,java 报告类 A 无法加载。

回想起来,上一次发生这种情况是在类 A 包含静态字段或装载类 B 的静态初始值设定项时。

所以在检查了类路径是否正确之后(实际上我在启动时转储了完整的类路径) ,然后对类 A 进行二进制切换。

我的意思是,我删除了 A 中的一半代码。

如果仍然失败,我删除另一半,直到问题(希望消失)。