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

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


当前回答

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

其他回答

如果您的情况与我的情况特别相似,这可能会对您有所帮助:作为初学者,我在尝试运行Java程序时也遇到了这个问题。

我是这样编译的:

javac HelloWorld.java

我也尝试使用相同的扩展名运行:

java Helloworld.java

当我删除.java并重写类似javaHelloWorld的命令时,程序运行得很好。:)

在这种情况下,我犯了这样一个错误:

java -cp lib.jar com.mypackage.Main

它与以下各项一起工作:;对于Windows和:对于Unix:

java -cp lib.jar; com.mypackage.Main

这是另一个花费了我一点时间的问题:命令行类路径参数的行为与您预期的不同。我在MacOS上直接调用CLI,并且在调用中包含两个jar。

例如,这两个都让工具混淆了主类的名称:

这是因为星号导致它错误地解析参数:

java-cp路径/to/jars/*com.mypackage.Main

这是因为我不知道为什么:

java-cp“*.jar”com.mypackage.Main

这是有效的:

java-cp“path/to/jars/*”com.mypackage.Main

显式列出两个jar也有效:

java-cp路径/to/jars/jar1.jar:路径/to/jar/jar2.jar com.mypackage.Main

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

文件名:Main.class

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

命令行命令:

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

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

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

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