我正在尝试运行Java应用程序,但出现此错误:
java.lang.ClassNotFoundException:
冒号到达后,缺少该类的位置。但是,我知道该位置不存在,因为该类位于其他位置。如何更新该课程的路径?它与类路径有关吗?
我正在尝试运行Java应用程序,但出现此错误:
java.lang.ClassNotFoundException:
冒号到达后,缺少该类的位置。但是,我知道该位置不存在,因为该类位于其他位置。如何更新该课程的路径?它与类路径有关吗?
Answers:
您的类路径已损坏(这是Java世界中非常普遍的问题)。
根据启动应用程序的方式,需要将参数修改为-cp
MANIFEST.MF中的Class-Path条目或磁盘布局。
类路径是要从中加载类的位置的列表。
这些“位置”可以是目录,也可以是jar文件。
对于目录,JVM将遵循预期的模式加载类。如果我的类路径中有目录C:/ myproject / classes,并且尝试加载类com.mycompany.Foo,它将在classes目录下查找名为com的目录,然后在该目录下查找名为mycompany的目录,并最后,它将在该目录中查找名为Foo.class的文件。
在第二种情况下,对于jar文件,它将在jar文件中搜索该类。实际上,jar文件只是上述目录的压缩集合。如果解压缩jar文件,则会按照上述模式获得一堆目录和类文件。
因此,JVM在尝试加载类定义时会从头到尾遍历类路径,以查找该类的定义。例如,在classpath中:
C:/ myproject / classes; C:/myproject/lib/stuff.jar; C:/myproject/lib/otherstuff.jar
JVM将尝试首先在目录类中查找,然后在stuff.jar中查找,最后在otherstuff.jar中查找。
当您收到ClassNotFoundException时,表示JVM遍历了整个类路径,但未找到您尝试引用的类。在Java世界中,解决方案通常是检查类路径。
您可以在命令行中输入java -cp,然后再输入类路径来定义类路径。在诸如Eclipse之类的IDE中,您将具有一个菜单选项来指定您的类路径。
这是我到目前为止找到的最佳解决方案。
假设我们有一个org.mypackage
包含类的包:
并且定义此软件包的文件实际存储在目录D:\myprogram
(在Windows上)或/home/user/myprogram
(在Linux上)下。
调用Java时,我们指定要运行的应用程序的名称:org.mypackage.HelloWorld
。但是,我们还必须告诉Java在哪里寻找定义我们程序包的文件和目录。因此,要启动该程序,我们必须使用以下命令:
注意:
java
无论您当前所在的位置如何,都必须执行上述命令。但是,情况并非如此javac
。为了进行编译,您甚至可以直接进入拥有.java
文件并直接执行的目录javac ClassName.java
。
如果您知道类的路径或包含该类的jar,则在运行它时将其添加到您的类路径中。您可以使用此处提到的类路径:
在Windows上
java -classpath .;yourjar.jar YourMainClass
在UNIX / Linux上
java -classpath .:yourjar.jar YourMainClass
用 ';' 作为分隔符。如果您的环境变量设置正确,则应该看到您的设置。如果您的PATH和CLASSPATH是正确的,则Windows应该可以识别这些命令。安装Java时,无需重新启动计算机。
将jar文件的完整路径添加到CLASSPATH。在Linux中使用:export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH"
。其他工作方式(无需编辑CLASSPATH)是将jar压缩到当前项目文件夹中。
方式对我不起作用:
1)使用-cp
带有jar文件完整路径的选项。
2)-cp
位于当前文件夹中时,仅使用jar的名称
3)将jar复制到当前项目文件夹
4)将jar复制到Java jar的标准位置(/ usr / share / java)
在mysql-connector-java.5-*。jar中针对com.mysql.jdbc.Driver类报告了该解决方案,该解决方案在具有OpenJDK版本1.7的Linux上运行
我也遇到了这个问题,并尝试了所有其他解决方案。我的HTML文件夹中没有.class文件,只有.java文件。一旦我添加了.class文件,程序就可以正常工作了。
如果您的类路径不正确,可能会发生
让我们在相同的项目名称下放置一个可序列化类和可反序列化的类。您运行序列化类,在特定文件夹中创建一个序列化对象。现在,您需要反序列化的数据。同时,如果您更改项目的名称,它将无法正常工作。您必须先运行可序列化的类,然后反序列化文件。
如果您添加了多个(第三方)**库并扩展了**应用程序类
然后可能会发生。
为此,您必须设置multiDexEnabled true
扩展Application
类并将其替换为 MultiDexApplication
。
它将解决。
基本通用问题-最简单的通用答案;)
根据这些信息,我将假设您可能正在尝试使用一些简单的文本编辑器和某些Command Shell来尝试一种基本的方法来编码,构建/编译和运行诸如“ Hello World”之类的简单控制台应用程序。
在休闲情况下会发生此错误:
..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class
换句话说,使用:
..\SomePath>java HelloWorld
PS添加文件扩展名.class会产生相同的错误。还请确保在操作系统的环境变量的PATH中具有Java的(JDK / JRE)bin文件夹。
如果您使用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中膨胀的所有依赖项
将所有代码放在try块中,然后在catch块中捕获异常
try
{
// code
}
catch(ClassNotFoundException e1)
{
e1.getmessage();
}