我试图运行一个Java应用程序,但是遇到了这个错误:
java.lang.ClassNotFoundException:
冒号后面跟着缺失的类所在的位置。然而,我知道该位置不存在,因为该类位于其他地方。我如何更新该类的路径?与类路径有关吗?
我试图运行一个Java应用程序,但是遇到了这个错误:
java.lang.ClassNotFoundException:
冒号后面跟着缺失的类所在的位置。然而,我知道该位置不存在,因为该类位于其他地方。我如何更新该类的路径?与类路径有关吗?
类路径是一组用于加载类的位置。
这些“位置”可以是目录或者jar文件。
对于目录,JVM将遵循一种预期模式来加载类。如果我的类路径中有目录C:/myproject/classes,并且我尝试加载一个名为com.mycompany.Foo的类,则会在classes目录下查找一个名为com的目录,然后在该目录下查找一个名为mycompany的目录,并最终在那个目录中查找名为Foo.class的文件。
在第二种情况下,对于jar文件,它将在jar文件中搜索该类。实际上,jar文件只是像上面那样的一堆目录的压缩集合。如果解压缩一个jar文件,你会得到一堆目录和遵循上述模式的类文件。
因此,当JVM尝试加载类定义时,它会从头到尾遍历类路径以查找类的定义。例如,在类路径:
C:/myproject/classes;C:/myproject/lib/stuff.jar;C:/myproject/lib/otherstuff.jar
JVM将首先尝试查找目录classes,然后在stuff.jar中查找,最后在otherstuff.jar中查找。
当你遇到ClassNotFoundException时,这意味着JVM已经遍历了整个类路径并且没有找到你尝试引用的类。解决方案通常是检查你的类路径,这在Java世界中是很常见的。
你可以通过在命令行中输入java -cp,然后输入你的类路径来定义一个类路径。在IDE(例如Eclipse)中,你会有一个菜单选项来指定你的类路径。
-cp
参数、MANIFEST.MF中的Class-Path条目或者磁盘布局。到目前为止,这是我发现的最佳解决方案。
假设我们有一个名为org.mypackage
的包,其中包含以下类:
并且定义此包的文件在物理上存储在目录D:\myprogram
(在Windows上)或/home/user/myprogram
(在Linux上)下。
当我们调用Java时,我们指定要运行的应用程序的名称:org.mypackage.HelloWorld
。但是,我们还必须告诉Java在哪里查找定义我们的包的文件和目录。因此,要启动程序,我们必须使用以下命令:
注意:无论您当前的位置在哪里,都必须执行上述
java
命令。但是对于javac
,情况并非如此。为了编译,您甚至可以直接进入具有您的.java
文件的目录,并直接执行javac ClassName.java
。
java -classpath .;yourjar.jar YourMainClass
在UNIX/Linux操作系统上
java -classpath .:yourjar.jar YourMainClass
mvn clean install
并尝试运行程序时,会抛出异常。因此,我清理项目并再次运行它,这样它就可以正常工作。mvn clean test
一次。它将编译所有测试类。基础通用问题 - 最简单的通用答案 ;)
根据信息,我假设您可能正在尝试基本的编码方法,使用一些简单的文本编辑器和一些命令行工具来构建/编译和运行一个简单的控制台应用程序,例如“Hello World”。
此错误发生在以下情况下:
..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class
换句话说,使用:
..\SomePath>java HelloWorld
附加文件扩展名 .class 会产生相同的错误。同时,请确保将 Java(JDK/JRE)的 bin 文件夹添加到操作系统的环境变量 PATH 中。(查找更多详细信息,请参阅其他帖子)
另外,我的假设/推断是否正确?
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包中。
FYI: 这将包括最终jar包中膨胀的所有依赖项。
export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH"
。另一种方法是将jar文件解压缩到当前项目文件夹中,而不需要编辑CLASSPATH,此方法同样可行。
以下方法对我无效:
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系统上有效。通过命令行将类的位置添加到类路径中,只需在运行时添加-cp
或-classpath
和类的位置。例如:
java -cp "c:/location/of/file" YourProgram
如果您正在运行像eclipse这样的IDE,您可以右键单击项目 -> 构建路径 -> 配置构建路径
并将包含您的类的外部JAR添加到构建路径中,然后它应该能够正常工作。
java ClassName.class
时,请改为运行java ClassName
。有时候自动补全会给出.\ClassName
,请将其中的.\
删除。 - Jerry wu