如何解析ClassNotFoundException?

4dbbbstv  于 2022-09-21  发布在  Eclipse
关注(0)|答案(27)|浏览(198)

我正在尝试运行一个Java应用程序,但收到以下错误:

java.lang.ClassNotFoundException:

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

okxuctiv

okxuctiv1#

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

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

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

在第二个示例中,对于JAR文件,它将在JAR文件中搜索该类。JAR文件实际上只是一个压缩的目录集合,如上面所示。如果解压缩一个JAR文件,您将获得一组遵循上述模式的目录和类文件。

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

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

JVM将尝试首先在CLASS目录中查找,然后在Stuff.jar中查找,最后在therStuff.jar中查找。

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

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

kg7wmglp

kg7wmglp2#

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

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

uubf1zoe

uubf1zoe3#

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

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

  • HelloWorld(主类)
  • SupportClass
  • UtilClass

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

文件结构将如下所示:

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

**注意:**无论您当前处于什么位置,都必须执行上面的java命令。但javac并非如此。为了进行编译,您甚至可以直接进入.java文件所在的目录,并直接执行javac ClassName.java

8ehkhllq

8ehkhllq4#

如果您知道类或包含类的JAR的路径,则在运行它时将其添加到类路径中。您可以使用下面提到的类路径:

在Windows上

java -classpath .;yourjar.jar YourMainClass

在Unix/Linux上

java -classpath .:yourjar.jar YourMainClass
xuo3flqw

xuo3flqw5#

如果你使用maven,可以试试这些。我在项目中使用Maven,当我执行mvn clean install并尝试运行程序时,它会抛出异常。所以,我清理了这个项目,并再次运行它,它对我来说很管用。

我使用的是eclipse IDE。

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

41ik7eoe

41ik7eoe6#

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

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

此错误发生在休眠方案中:

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

换句话说,使用:

..SomePath>java HelloWorld

附注:添加文件扩展名.class会产生相同的错误。还要确保在操作系统的环境变量路径中有Java的(JDK/JRE)bin文件夹。(查找更多详细信息)附注:我的假设是正确的吗?

gdrx4gfi

gdrx4gfi7#

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

0qx6xfy6

0qx6xfy68#

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

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

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

t2a7ltrp

t2a7ltrp9#

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

sxpgvts3

sxpgvts310#

将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-Connector-java.5-.jar中的com.mysql.jdbc.Driver类,适用于带有OpenJDK版本1.7的Linux
r55awzrz

r55awzrz11#

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

tgabmvqs

tgabmvqs12#

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

  • 我导入了两个库AB
  • AB都依赖于另一个库C,但C的版本不同。假设A依赖于C 1.0B依赖于C 2.0
  • B使用仅存在于C 2.0中的类;
  • 然而,A在依赖树中更接近,所以Maven将C 1.0同时用于AB,并且甚至不警告您(这对我来说是相当令人惊讶的);
  • 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可视化依赖关系树。

agyaoht7

agyaoht713#

转到顶部并删除IMPORT语句(如果有),然后重新导入类。但如果情况并非如此,请进行清理,然后进行构建。您使用的是NetBeans还是Eclipse?

hs1rzwqc

hs1rzwqc14#

我也遇到了这种情况,并尝试了所有其他解决方案。我的HTML文件夹中没有.class文件,我只有.Java文件。一旦我添加了.class文件,程序就可以正常运行。

9rnv2umw

9rnv2umw15#

1.如果您的类路径不正确,可能会发生这种情况
1.让我们假设一个可序列化的类和一个可反序列化的类位于同一项目名下。运行Serializable类,在特定文件夹中创建一个可序列化对象。现在,您需要非本土化的数据。同时,如果您更改项目的名称,它将不起作用。您必须首先运行可序列化类,然后反序列化文件。

相关问题