如何解决ClassNotFoundException?

时间:2013-07-01 15:58:58

标签: java class classpath classnotfoundexception

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

java.lang.ClassNotFoundException:

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

25 个答案:

答案 0 :(得分:40)

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

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

答案 1 :(得分:28)

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

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

答案 2 :(得分:10)

这是我到目前为止发现的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

答案 3 :(得分:6)

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

Windows上的

java -classpath .;yourjar.jar YourMainClass

在UNIX / Linux上

java -classpath .:yourjar.jar YourMainClass

答案 4 :(得分:4)

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

我使用的是eclipse IDE。

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

答案 5 :(得分:3)

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

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

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

答案 6 :(得分: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上工作

答案 7 :(得分:3)

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

答案 8 :(得分:2)

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

答案 9 :(得分:2)

我刚刚做了

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

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

答案 10 :(得分:2)

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

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

答案 11 :(得分:2)

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

答案 12 :(得分:2)

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

答案 13 :(得分:1)

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

答案 14 :(得分:1)

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

答案 15 :(得分:0)

如果您添加了多个(第三方)**库并扩展了** Application

然后它可能会发生。

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

它将解决。

答案 16 :(得分:0)

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

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

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

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

换句话说,使用:

..\SomePath>java HelloWorld

P.S。添加文件扩展名.class会产生相同的错误。 还请确保在操作系统的环境变量的PATH中具有Java的(JDK / JRE)bin文件夹。(有关更多详细信息,请查阅此文章) P.P.S我的假设是否正确?

答案 17 :(得分:0)

如果您使用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中

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

降级可以使我运行相同的代码而没有任何问题。

答案 20 :(得分:0)

如果您已将项目移至新计算机或从git导入,请尝试此操作。

  1. 右键单击类>运行方式>运行配置
  2. 删除主类参考
  3. 应用>关闭
  4. 现在再次右键单击class>以Java应用程序运行。

对我有用。

答案 21 :(得分:0)

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

答案 22 :(得分: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
爪哇:15.0.1
Maven:3.8.1

答案 23 :(得分:-1)

我删除了一些未使用的导入,它为我解决了问题。如果你从不首先寻找它,你就找不到一个类。

答案 24 :(得分:-4)

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

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