新Java开发人员遇到的一个常见问题是,他们的程序无法运行,并显示错误消息:无法找到或加载主类。。。

这意味着什么,是什么导致的,你应该如何解决?


当前回答

如果源代码名为HelloWorld.java,则编译代码将为HelloWorld.class。

如果使用以下方法调用它,则会出现该错误:

java HelloWorld.class

相反,请使用以下方法:

java HelloWorld

其他回答

在我的例子中,出现错误是因为我提供了源文件名而不是类名。

我们需要向解释器提供包含main方法的类名。

排除以下文件解决了问题。

META-INF/*.SF

META-INF/*.DSA

META-INF/*.RSA

在build.gradle中添加了以下代码

jar {
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
    {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }
    manifest {
        attributes(
                'Main-Class': 'mainclass'
        )
    }
}

原因#2-应用程序的类路径指定不正确。阅读之前链接的三个文档。(是的……阅读它们!重要的是,Java程序员至少了解Java类路径机制的基本原理。)。

JDK工具和实用程序常规常规信息(文件结构、类路径、如何找到类、更改)增强功能(JDK 7中的增强功能)标准JDK工具与实用程序

https://docs.oracle.com/javase/7/docs/technotes/tools/index.html

https://docs.oracle.com/javase/7/docs/technotes/tools/findingclasses.html

https://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

Java Launcher如何查找类了解类路径和包名

https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javac.html

Java中的ClassLoader Java ClassLoader是Java运行时环境的一部分,它将Java类动态加载到Java虚拟机中。由于类加载器,Java运行时系统不需要了解文件和文件系统。

Java类不会一次加载到内存中,而是在应用程序需要时加载。此时,JRE调用Java ClassLoader,这些ClassLoader将类动态加载到内存中。

https://en.wikipedia.org/wiki/Java_Classloader

https://www.geeksforgeeks.org/classloader-in-java/

https://en.wikipedia.org/wiki/Java_virtual_machine

使用关键字“package”

如果源代码中有package关键字(主类在包中定义),则应使用类的全名(packageName.MainClassName)在分层目录中运行它。

假设有一个源代码文件(Main.java):

package com.test;

public class Main {

    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}

要运行此代码,应将Main.Class放在类似于包的目录中:

C: \Users\workspace\testapp.com\test\Main.Java

然后将终端的当前目录更改为项目的根目录:

cd C:\Users\workspace\testapp

最后,运行代码:

java com.test.Main

没有关键字“package”

如果您的源代码名称中没有任何包,那么可能是您使用了错误的命令。假设您的Java文件名为Main.Java,编译后:

javac Main.java

编译后的代码将是Main.class

如果使用以下方法调用它,则会出现该错误:

java Main.class

相反,请使用以下方法:

java Main

类文件位置:C:\test.com\company

文件名:Main.class

完全限定类名:com.company.Main

命令行命令:

java  -classpath "C:\test" com.company.Main

请注意,类路径不包括.com\company。