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

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


当前回答

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

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'
        )
    }
}

其他回答

在命令行上指定类路径对我有帮助。例如:

创建新文件夹C:\temp在C:\Temp中创建Temp.java文件,其中包含以下类:公共类温度{公共静态void main(字符串参数[]){System.out.println(args[0]);}}打开C:\temp文件夹中的命令行,并编写以下命令以编译temp类:javac Temp.java运行编译后的Java类,添加-classpath选项,让JRE知道在哪里可以找到该类:java-classpath C:\tempTemp您好!

如果类在包中,则必须cd到项目的根目录,并使用类的完全限定名称(packageName.MainClassName)运行。

例子:

我的课程在这里:

D:\project\com\cse\

我的主类的完全限定名称是:

com.cse.Main

所以我回到根项目目录:

D:\project

然后发出java命令:

java com.cse.Main

这个答案是为了帮助新手Java程序员摆脱一个常见错误带来的挫折。我建议您阅读公认的答案,以获得有关Java类路径的更深入的知识。

我上升了一级。因此,现在HelloWorld.class文件位于hello\HelloWorld.cclass中,我运行了以下命令。其中cp是类路径和。表示仅签入当前目录。

java -cp . hello.HelloWorld

输出

Hello world!

这是一个具体的案例:

Windows(通过Windows7测试)不接受类和包名称中的特殊字符(如á)。不过,Linux确实如此。

我在NetBeans中构建.jar并尝试在命令行中运行时发现了这一点。它在NetBeans中运行,但不在命令行上运行。

在我的例子中,我得到了错误,因为我在Windows7系统上混合了大写和小写的包名。将包名称改为全小写解决了问题。还要注意,在这个场景中,我将.java文件编译为.class文件时没有出错;它不会从同一个(sub-sub-sub)目录运行。