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