如何解决ClassNotFoundException?

use*_*316 90 java class classpath classnotfoundexception

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

java.lang.ClassNotFoundException:

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

小智 44

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

这些"位置"可以是目录,也可以是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中,您将有一个菜单选项来指定类路径.


Tho*_*sen 28

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

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

  • 你能不能特定日食?我需要做什么? (28认同)
  • 您的问题没有包含足够的信息来提供更具说明性的答案.考虑添加它. (19认同)
  • 我只是强调,除了Java世界之外,所有软件都在努力确保找到正确版本的依赖项.我可以提到dll-hell,包管理器,版本管理器,spring boot物料清单和docker容器作为此问题的示例和可能的解决方案.外国代码的比例越大,问题就越大. (2认同)

Ram*_*tra 12

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

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

  • HelloWorld(主类)
  • SupportClass
  • UtilClass

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

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

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

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


Che*_* Ni 11

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

  • 我导入了两个库,A并且B
  • AB依赖于另一个库C,但版本不同C。假设A取决于C 1.0B取决于C 2.0;
  • B使用仅存在于C 2.0;中的类
  • 然而,A在依赖关系树中“更接近”,所以 MavenC 1.0同时使用AB,甚至不会警告你这一点(这对我来说非常令人震惊);
  • 结果,当B尝试使用仅存在于 中的类时,会抛出C 2.0a ;ClassNotFoundException

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

这实在是让我抓狂了……

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

请参考这篇文章,了解 Maven 如何选择最接近的依赖项:/sf/answers/4467059831/

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

  • 到目前为止最有用的答案,因为它很好地解释了现实生活中常见的情况,而不是像大多数其他答案那样只是鹦鹉学舌地“检查你的类路径”。 (4认同)

Jun*_*san 6

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

在Windows上

java -classpath .;yourjar.jar YourMainClass
Run Code Online (Sandbox Code Playgroud)

在UNIX/Linux上

java -classpath .:yourjar.jar YourMainClass
Run Code Online (Sandbox Code Playgroud)


Vas*_*sil 5

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

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

此错误发生在以下情况:

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class
Run Code Online (Sandbox Code Playgroud)

换句话说,使用:

..\SomePath>java HelloWorld
Run Code Online (Sandbox Code Playgroud)

PS 添加文件扩展名.class会产生同样的错误。另外,请确保操作系统的环境变量的 PATH 中有 Java (JDK/JRE) bin 文件夹。
PPS 我的假设正确吗?