如何解析ClassNotFoundException?

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

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

java.lang.ClassNotFoundException:

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

agyaoht7

agyaoht716#

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

tgabmvqs

tgabmvqs17#

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

  • 我导入了两个库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可视化依赖关系树。

r55awzrz

r55awzrz18#

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

sxpgvts3

sxpgvts319#

将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
t2a7ltrp

t2a7ltrp20#

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

0qx6xfy6

0qx6xfy621#

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

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

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

gdrx4gfi

gdrx4gfi22#

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

41ik7eoe

41ik7eoe23#

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

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

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

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

换句话说,使用:

..SomePath>java HelloWorld

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

xuo3flqw

xuo3flqw24#

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

我使用的是eclipse IDE。

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

8ehkhllq

8ehkhllq25#

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

在Windows上

java -classpath .;yourjar.jar YourMainClass

在Unix/Linux上

java -classpath .:yourjar.jar YourMainClass
uubf1zoe

uubf1zoe26#

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

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

  • HelloWorld(主类)
  • SupportClass
  • UtilClass

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

文件结构将如下所示:

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

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

kg7wmglp

kg7wmglp27#

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

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

相关问题