136

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

java.lang.ClassNotFoundException:

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

4

27 回答 27

53

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

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

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

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

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

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

JVM 将尝试首先查看目录,然后是stuff.jar,最后是otherstuff.jar

当你得到一个 ClassNotFoundException 时,这意味着 JVM 已经遍历了整个类路径并且没有找到你试图引用的类。在 Java 世界中,解决方案是检查您的类路径。

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

于 2013-07-01T16:20:52.440 回答
40

您的类路径已损坏(这是Java 世界中非常常见的问题)。

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

于 2013-07-01T16:02:10.563 回答
20

这是迄今为止我找到的最好的解决方案。

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

  • HelloWorld(主类)
  • 支持类
  • 实用程序类

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

文件结构将如下所示: 在此处输入图像描述

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

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

于 2015-10-05T06:44:45.410 回答
9

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

在 Windows 上

java -classpath .;yourjar.jar YourMainClass

在 UNIX/Linux 上

java -classpath .:yourjar.jar YourMainClass
于 2013-07-01T16:00:15.033 回答
4

如果您使用 Maven,请尝试这些。我将 maven 用于我的项目,当我这样做mvn clean install并尝试运行程序时,它会引发异常。所以,我清理了项目并再次运行它,它对我有用。

我使用 Eclipse IDE。

对于运行 Junit 测试时的 Class Not Found Exception,请尝试运行mvn clean test一次。它将编译所有测试类。

于 2015-04-22T19:48:34.643 回答
4

如果您使用 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 中膨胀的所有依赖项

于 2019-12-13T13:33:41.063 回答
4

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

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

此错误发生在休闲场景中:

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

换句话说,使用:

..\SomePath>java HelloWorld

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

于 2019-02-13T18:43:30.870 回答
3

要通过命令行将类的位置添加到类路径中,只需在运行时添加-cp-classpath和类的位置。IE

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

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

于 2013-07-01T16:05:26.443 回答
3

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

于 2015-01-19T08:33:42.333 回答
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

于 2015-12-04T09:05:35.763 回答
2
  1. 如果您的类路径不正确,可能会发生这种情况

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

于 2014-02-10T22:05:14.423 回答
2

如果有,则上到顶部并删除导入语句,然后重新导入该类。但如果不是这种情况,请先清理然后构建。您使用的是 Netbeans 还是 Eclipse?

于 2013-07-01T16:04:57.467 回答
2

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

于 2014-01-13T15:35:57.287 回答
2

我已经做了

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

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

于 2018-02-19T11:27:51.040 回答
2

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

于 2017-01-11T08:16:31.340 回答
2

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

于 2018-04-03T14:03:56.210 回答
1

如果您添加了多个(第三方)**库和扩展**应用程序

那么它可能会发生。

为此,您必须将multiDexEnabled true扩展Application类 设置和替换为MultiDexApplication.

会解决的。

于 2018-09-22T09:41:28.197 回答
1

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

  • 我导入了两个库,A并且B
  • 两者都A依赖B于另一个库C,但不同版本的C. 让我们说A取决于C 1.0B取决于C 2.0;
  • B使用仅存在于的类C 2.0
  • 但是,A在依赖关系树中“更接近”,因此 MavenC 1.0两者都使用,A并且B甚至不会警告您(这对我来说非常令人震惊);
  • 结果,当B尝试使用仅存在于 中的类时C 2.0ClassNotFoundException会抛出 a;

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

这真的把我逼疯了……

我最终不得不添加C 2.0到 mypom.xml以便可以选择它而不是C 1.0.

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

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

于 2021-11-07T15:36:19.163 回答
1

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

于 2018-02-14T13:24:33.853 回答
0

在将 Visual Studio Code 中的“Java 语言支持”插件从版本 0.66.0 升级到 0.67.0 后,我开始遇到此问题。

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

于 2020-09-27T04:29:38.767 回答
0

如果您已将项目移动到新机器或从 git 导入,请尝试此操作。

  1. 右键单击类>运行方式>运行配置
  2. 删除主类引用
  3. 应用 > 关闭
  4. 现在再次右键单击类 > 作为 java 应用程序运行。

它对我有用。

于 2020-11-03T09:56:52.513 回答
0

在我的情况下,作为类未找到异常抛出的类具有与 ssl 证书相关的属性。关闭eclipse并以“以管理员身份运行”打开,然后问题得到解决。由于 Eclipse 具有与问题相关的权限,它会抛出此类异常。

于 2020-02-13T06:16:54.460 回答
0

值得注意的是,有时 Java 会谎报导致问题的类。

如果 java 尝试加载依赖于 B 类的 A 类并且无法加载 B 类,则会出现此错误。

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

回想起来,上一次发生这种情况是当类 A 包含一个静态字段或加载类 B 的静态初始化程序时。

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

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

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

于 2021-11-18T03:41:03.387 回答
0

我在终端运行 Java 代码并添加类路径是这样的解决方案:
> 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

我的运行环境:
  操作系统:Windows 10
  JAVA:15.0.1
  Maven:3.8.1

于 2021-07-19T18:10:56.233 回答
-1

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

于 2021-02-22T07:52:04.247 回答
-2

我删除了一些未使用的导入,它为我解决了这个问题。如果你一开始就没有找到一个类,你就找不到一个类。

于 2021-02-05T10:37:49.360 回答
-11

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

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}
于 2015-02-23T15:53:21.953 回答