如何解决ClassNotFoundException?


106

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

java.lang.ClassNotFoundException:

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


1
您必须将缺少类的罐子添加到classptah
Crom

如果您的课程有课程,请转到包含课程的文件夹。例如,如果package是package test.abc,则在test之前转到文件夹,然后执行java -cp。test.abc.CLASSNAME(不带.class)。如果没有包,则转到包含class的文件夹,然后说java -cp。CLASSNAME
可选,

一个类没有部署到您的运行时(例如缺少jar),或者该类在给定的类加载器中不可见,请检查此工具以帮助解决以下问题:jhades.org
Angular University

1
有时我也会遇到这个问题。该异常显然违反了在异常消息中声明所有必要上下文的规则。应提到在那里它试图寻找的东西,什么是你的类路径中。请提出更好的异常消息。不要让我们寻找可以帮助解决问题的信息。
masterxilo

Answers:


32

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

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


33
您能否更偏食?我需要做什么?
user2426316

24
您的问题所包含的信息不足,无法提供更具体的答案。考虑添加。
托尔比约恩Ravn的安徒生

在几乎所有编程环境中,依赖项解析/版本不匹配都是一个非常普遍的问题。我们可以说所有程序都可以解析这样的定义……问题始终是定义在什么地方/在哪里,您指的是哪个版本?
masterxilo

2
我只是在强调,除了Java世界之外,所有软件都在确保找到正确版本的依赖项方面进行着努力。我可以提到dll-hell,程序包管理器,版本管理器,spring boot物料清单和docker容器作为此问题和可能解决方案的示例。外部代码比例越大,问题越严重。
masterxilo

@masterxilo是的,但这不一定是这里的问题,您可能在拨错树。可以说的是类路径已损坏。
托尔比约恩Ravn的安徒生

45

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

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

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

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

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

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中,您将具有一个菜单选项来指定您的类路径。


13

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

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

  • HelloWorld(主类)
  • 支持等级
  • 实用类

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

文件结构将如下所示: 在此处输入图片说明

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

注意: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一次。它将编译所有测试类。


运行“ mvn clean test”时,您位于哪个目录?与POM在同一目录中吗?
TacoB0t

1
是。从存在pom文件的目录中运行该文件。
阿伦(Arun)

3

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

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

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


3

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


5
那是在Windows(分号)上,在Unix / Linux上是':'(冒号)
Joeblade 2015年

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上运行


只有解压缩JAR
才对

2

转到顶部,并删除导入语句(如果有的话),然后重新导入该类。但是,如果不是这种情况,请进行清理然后再构建。您正在使用Netbeans还是Eclipse?


2

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


2
  1. 如果您的类路径不正确,可能会发生

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


2

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


2

我已经做了

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

2. 重建解决问题的项目


1

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


1

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


1

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

然后可能会发生。

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

它将解决。


1

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

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

在休闲情况下会发生此错误:

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

换句话说,使用:

..\SomePath>java HelloWorld

PS添加文件扩展名.class会产生相同的错误。还请确保在操作系统的环境变量的PATH中具有Java的(JDK / JRE)bin文件夹。


1

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


@Archit添加了。
techkuz

0

就我而言,作为未找到类异常抛出的类具有与ssl证书相关的属性。关闭月食并以“以管理员身份运行”打开,然后问题解决了。由于Eclipse具有与发布相关的权限,因此它将引发此类异常。


-7

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

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

5
这不能解决异常。这隐藏了异常。此外,“ e1.getmessage()”是a)getMessage()的大写错误,并且b)不会做太多事情,因为它返回带有消息的字符串,并且您不会打印或记录它或任何东西!
IBBoard '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.