我正在尝试运行一个Java应用程序,但收到以下错误:
java.lang.ClassNotFoundException:
冒号后面是缺少的类的位置。然而,我知道那个地点并不存在,因为班级位于其他地方。我如何更新该类的路径?这与类路径有关吗?
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中,您将有一个菜单选项来指定您的类路径。
kg7wmglp2#
您的类路径已损坏(这在Java世界中是一个“非常”常见的问题)。
根据启动应用程序的方式,需要将参数修改为-cp、MANIFEST.MF中的Class-Path条目或磁盘布局。
-cp
uubf1zoe3#
这是我到目前为止找到的最好的解决方案。
假设我们有一个名为org.mypackage的包,其中包含以下类:
org.mypackage
定义该包的文件物理存储在目录D:\myprogram(在Windows上)或/home/user/myprogram(在Linux上)下。
D:\myprogram
/home/user/myprogram
文件结构将如下所示:
在调用Java时,我们指定要运行的应用程序的名称:org.mypackage.HelloWorld。但是,我们还必须告诉Java在哪里查找定义我们的包的文件和目录。因此,要启动该程序,我们必须使用以下命令:
org.mypackage.HelloWorld
**注意:**无论您当前处于什么位置,都必须执行上面的java命令。但javac并非如此。为了进行编译,您甚至可以直接进入.java文件所在的目录,并直接执行javac ClassName.java。
java
javac
.java
javac ClassName.java
8ehkhllq4#
如果您知道类或包含类的JAR的路径,则在运行它时将其添加到类路径中。您可以使用下面提到的类路径:
在Windows上
java -classpath .;yourjar.jar YourMainClass
在Unix/Linux上
java -classpath .:yourjar.jar YourMainClass
xuo3flqw5#
如果你使用maven,可以试试这些。我在项目中使用Maven,当我执行mvn clean install并尝试运行程序时,它会抛出异常。所以,我清理了这个项目,并再次运行它,它对我来说很管用。
mvn clean install
我使用的是eclipse IDE。
对于运行Junit测试时找不到类异常,请尝试运行mvn clean test一次。它将编译所有测试类。
mvn clean test
41ik7eoe6#
基本通用问题--最简单的通用答案;)
鉴于这些信息,我假设您可能正在尝试一种基本的方法来编码、构建/编译和运行一个简单的控制台应用程序,比如“Hello World”,使用一些简单的文本编辑器和一些命令外壳。
此错误发生在休眠方案中:
..SomePath>javac HelloWorld.java ..SomePath>java HelloWorld.class
换句话说,使用:
..SomePath>java HelloWorld
附注:添加文件扩展名.class会产生相同的错误。还要确保在操作系统的环境变量路径中有Java的(JDK/JRE)bin文件夹。(查找更多详细信息)附注:我的假设是正确的吗?
gdrx4gfi7#
如果您使用maven,请检查您的pom.xml中是否有此插件:
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中膨胀的所有依赖项
0qx6xfy68#
要通过命令行将类的位置添加到类路径中,只需在运行时添加-cp或-classpath和类的位置。也就是说。
-classpath
java -cp "c:/location/of/file" YourProgram
或者,如果您正在运行诸如eclipse之类的IDE,您可以右键单击project -> build path -> configure build path并将包含您的类的外部JAR添加到构建路径中,那么它应该可以很好地工作。
project -> build path -> configure build path
t2a7ltrp9#
使用‘;’作为分隔符。如果您的环境变量设置正确,您应该会看到您的设置。如果您的PATH和CLASSPATH正确,Windows应该能识别这些命令。安装Java时不需要重新启动计算机。
sxpgvts310#
将JAR文件的全路径添加到CLASSPATH中。在Linux中使用:export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH"。另一种工作方式(不编辑CLASSPATH)是解压缩当前项目文件夹中的JAR。
export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH"
方法对我不起作用:
1)使用带有JAR文件完整路径的-cp选项。
2)在当前文件夹中仅使用名称为jar的-cp
3)将JAR文件复制到当前项目文件夹
4)将JAR复制到Java JAR的标准位置(/usr/Share/Java)
r55awzrz11#
在Java更新后,这可能会在Windows上发生,其中缺少旧版本的Java SDK,而存在新的版本。我会检查您的IDE是否使用已安装的Java SDK版本(IntelliJ:Ctrl+Shift+Alt+S)
tgabmvqs12#
我犯了同样的错误,花了一整天的时间才意识到这是一个依赖冲突的问题:
A
B
C
C 1.0
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可视化依赖关系树。
mvn dependency:tree
agyaoht713#
转到顶部并删除IMPORT语句(如果有),然后重新导入类。但如果情况并非如此,请进行清理,然后进行构建。您使用的是NetBeans还是Eclipse?
hs1rzwqc14#
我也遇到了这种情况,并尝试了所有其他解决方案。我的HTML文件夹中没有.class文件,我只有.Java文件。一旦我添加了.class文件,程序就可以正常运行。
9rnv2umw15#
1.如果您的类路径不正确,可能会发生这种情况1.让我们假设一个可序列化的类和一个可反序列化的类位于同一项目名下。运行Serializable类,在特定文件夹中创建一个可序列化对象。现在,您需要非本土化的数据。同时,如果您更改项目的名称,它将不起作用。您必须首先运行可序列化类,然后反序列化文件。
27条答案
按热度按时间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中,您将有一个菜单选项来指定您的类路径。
kg7wmglp2#
您的类路径已损坏(这在Java世界中是一个“非常”常见的问题)。
根据启动应用程序的方式,需要将参数修改为
-cp
、MANIFEST.MF中的Class-Path条目或磁盘布局。uubf1zoe3#
这是我到目前为止找到的最好的解决方案。
假设我们有一个名为
org.mypackage
的包,其中包含以下类:定义该包的文件物理存储在目录
D:\myprogram
(在Windows上)或/home/user/myprogram
(在Linux上)下。文件结构将如下所示:
在调用Java时,我们指定要运行的应用程序的名称:
org.mypackage.HelloWorld
。但是,我们还必须告诉Java在哪里查找定义我们的包的文件和目录。因此,要启动该程序,我们必须使用以下命令:**注意:**无论您当前处于什么位置,都必须执行上面的
java
命令。但javac
并非如此。为了进行编译,您甚至可以直接进入.java
文件所在的目录,并直接执行javac ClassName.java
。8ehkhllq4#
如果您知道类或包含类的JAR的路径,则在运行它时将其添加到类路径中。您可以使用下面提到的类路径:
在Windows上
在Unix/Linux上
xuo3flqw5#
如果你使用maven,可以试试这些。我在项目中使用Maven,当我执行
mvn clean install
并尝试运行程序时,它会抛出异常。所以,我清理了这个项目,并再次运行它,它对我来说很管用。我使用的是eclipse IDE。
对于运行Junit测试时找不到类异常,请尝试运行
mvn clean test
一次。它将编译所有测试类。41ik7eoe6#
基本通用问题--最简单的通用答案;)
鉴于这些信息,我假设您可能正在尝试一种基本的方法来编码、构建/编译和运行一个简单的控制台应用程序,比如“Hello World”,使用一些简单的文本编辑器和一些命令外壳。
此错误发生在休眠方案中:
换句话说,使用:
附注:添加文件扩展名.class会产生相同的错误。还要确保在操作系统的环境变量路径中有Java的(JDK/JRE)bin文件夹。(查找更多详细信息)附注:我的假设是正确的吗?
gdrx4gfi7#
如果您使用maven,请检查您的
pom.xml
中是否有此插件:它将把您的依赖项(异常原因)放到您的JAR中。
仅供参考:这将包括最终JAR中膨胀的所有依赖项
0qx6xfy68#
要通过命令行将类的位置添加到类路径中,只需在运行时添加
-cp
或-classpath
和类的位置。也就是说。或者,如果您正在运行诸如eclipse之类的IDE,您可以右键单击
project -> build path -> configure build path
并将包含您的类的外部JAR添加到构建路径中,那么它应该可以很好地工作。t2a7ltrp9#
使用‘;’作为分隔符。如果您的环境变量设置正确,您应该会看到您的设置。如果您的PATH和CLASSPATH正确,Windows应该能识别这些命令。安装Java时不需要重新启动计算机。
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)
r55awzrz11#
在Java更新后,这可能会在Windows上发生,其中缺少旧版本的Java SDK,而存在新的版本。我会检查您的IDE是否使用已安装的Java SDK版本(IntelliJ:Ctrl+Shift+Alt+S)
tgabmvqs12#
我犯了同样的错误,花了一整天的时间才意识到这是一个依赖冲突的问题:
A
和B
;A
和B
都依赖于另一个库C
,但C
的版本不同。假设A
依赖于C 1.0
,B
依赖于C 2.0
;B
使用仅存在于C 2.0
中的类;A
在依赖树中更接近,所以Maven将C 1.0
同时用于A
和B
,并且甚至不警告您(这对我来说是相当令人惊讶的);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
可视化依赖关系树。agyaoht713#
转到顶部并删除IMPORT语句(如果有),然后重新导入类。但如果情况并非如此,请进行清理,然后进行构建。您使用的是NetBeans还是Eclipse?
hs1rzwqc14#
我也遇到了这种情况,并尝试了所有其他解决方案。我的HTML文件夹中没有.class文件,我只有.Java文件。一旦我添加了.class文件,程序就可以正常运行。
9rnv2umw15#
1.如果您的类路径不正确,可能会发生这种情况
1.让我们假设一个可序列化的类和一个可反序列化的类位于同一项目名下。运行Serializable类,在特定文件夹中创建一个可序列化对象。现在,您需要非本土化的数据。同时,如果您更改项目的名称,它将不起作用。您必须首先运行可序列化类,然后反序列化文件。