无法找到或加载主类Java?这是解决方法!

如果您无缘无故地在Java项目中不断遇到未找到主类的错误,请不要担心,您并不孤单。

作为最不可预见和自发的错误之一,由于JVM(Java虚拟机)倾向于使用默认的类路径,“未找到主类”的问题困扰着业余爱好者和专业人士。

但是这个问题实际上没有看起来那么令人生畏。请继续阅读以了解如何彻底消除此错误。

为什么找不到主班?

在尝试了解JVM如何以及为什么无法找到主类之前,我们需要了解Java中的Classpath的概念。

什么是类路径?

classpath是Java运行时环境搜索类和其他资源文件的文件路径。可以在执行程序时使用-classpath选项或通过设置系统CLASSPATH环境变量来设置它。

顾名思义,它只是一个文件路径,可以在JDK包或目录中找到.class文件。

当JVM无法找到主类时,通常是因为它正在错误的类路径中寻找相应的.class文件。当然,纠正此问题的方法是通过使用软件包或指定类路径来手动指定类路径。

在这一点上,如果您想刷新Java类的记忆,请查看我们的Java中创建类的指南。

使用包

让我们创建一个称为Test的类。将其放在名为testPackage的包中。包在Java中使用,以便将相似的类组合在一起或为类提供唯一的名称空间。

在这个简单的示例中,使用包将帮助您可视化Java的类路径的工作方式。在文件管理器应用程序中,程序包表示为一个独立的文件夹。

 package testPackage;
public class Test {
public static void main(String args[]) {
System.out.println("File successfully found!");
}
}

现在,打开一个新终端,并确保您的工作目录与包含package文件夹的目录相同。您可以在任何操作系统上使用cd命令来更改工作目录。

通过运行以下命令来编译Test.java

 package testPackage;
javac testPackage/Test.java

这会将已编译的二进制文件(.class文件)保存在testPackage中。

要运行编译的类,您需要在命令行中键入完全限定的类名称。 Java类的完全限定名称是指其名称加上其包名称的前缀。在这种情况下,应如下所示:

 java testPackage.Test

这种调用类文件的方式还确保您可以从同一工作目录中的不同包中调用可执行文件。您所要做的就是修改完全限定的类名。

在更高级的实现中,我们建议您为类和源文件创建单独的子文件夹,以更好地管理包中的文件。

手动指定类路径

建议的管理Java文件的方法是为源文件和类创建单独的目录。如果您正在从事一个项目,则可能您已经在执行此操作。

按照惯例,带有源文件的目录被标记为src ,带有.class文件的目录被标记为类。由于目录结构正确,这也是确保JVM找不到主类的可能性大大降低的一种方法。

如果使用此方法,则在编译之前,目录结构将如下所示:

 |---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes

上图中的每个缩进都对应于项目应遵循的文件层次结构的一个级别。

要进行编译,请确保您的工作目录为myFolder。现在,键入以下命令:

 javac -d classes src/testPackage/Test.java

.class可执行文件应保存在myFolder / classes / testPackage中。因此,文件目录结构如下所示:

 |---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes
| |---testPackage
| |---Test.class

要运行.class文件,请使用完全限定的类名运行Java命令并指定本地类路径。相对于工作目录(在本例中为myFolder)声明了每个路径。

 java -classpath classes testPackage

运行此命令将为您提供所需的输出。但是,为什么要解决一个简单的错误就需要进行如此多的重组?

用Java组织文件的重要性

引发“无法找到或加载主类”的根本原因是因为JVM无法找到您的.class文件的存储位置。

解决此错误的最简单方法是控制.class文件的存储位置,并明确告诉JVM在其中查找。通过分别组织源文件和可执行文件并控制工作目录中的所有内容,可以实现此目的。

当您开始向项目中添加诸如继承之类的结构时,文件系统的复杂性必然会增加很多。在此类项目中,甚至在那些需要使用JAR文件或自定义库的项目中,隔离和管理文件的简单做法也可以为您节省大量的故障排除和调试时间。

要了解有关类路径如何在Java中工作以及在运行代码时可以控制的众多内容的更多信息,还可以查看Oracle的详细且用户友好的参考资料