新Java开发人员遇到的一个常见问题是,他们的程序无法运行,并显示错误消息:无法找到或加载主类。。。
这意味着什么,是什么导致的,你应该如何解决?
新Java开发人员遇到的一个常见问题是,他们的程序无法运行,并显示错误消息:无法找到或加载主类。。。
这意味着什么,是什么导致的,你应该如何解决?
当前回答
场景:使用命令提示符(Windows中的CMD)编译并运行一个简单的“java”程序,该程序只有“Main.java”文件,并指定了“packagemain”。
源文件路径:
某些项目名称文件夹\src\main\main.java
目标文件夹:
某些项目名称文件夹\dest
目标文件路径(文件夹'\main'和文件'\main.class'将由'javac'生成):
某些项目名称文件夹\dest\main\main.class
Main.java如下:
package main;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
编制:
// 'javac' compiler will produce 'Main.class' in the 'dest\main' folder.
// 'main' folder is created because in the source file(in our case: 'Main.java') is
// specified 'package main'.
javac -d ./dest ./src/main/Main.java
运行编译文件(在本例中为“Main.class”):
// '-cp'(is the same as '-classpath')
// './dest'(means destination folder, where resides compiled 'Main.class').
// 'main.Main'(means 'package' 'main', which contains class 'Main'('Main.class'))
// WARNING: when run 'java' class, MUST NOT type extension '.class'
// after 'class name
// (in our case: 'main.Main'(<package>.<class-name>) WITHOUT extension
// '.class').
java -cp ./dest main.Main
// Hello world
其他回答
这是另一个花费了我一点时间的问题:命令行类路径参数的行为与您预期的不同。我在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
我以为我不知怎么设置了错误的类路径,但问题是我键入了:
java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool
而不是:
java -cp C:/java/MyClasses utilities/myapp/Cool
我认为完全限定的意思是包含完整的路径名而不是完整的包名。
在搜索了两天后,我找到了这个解决方案,并成功了。这很奇怪,但它对我有用。
package javaapplication3;
public class JavaApplication3 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
System.out.println("Hello");
}
}
这是我要运行的程序,位于C:\Java Projects\JavaApplication3\src\JavaApplication3
现在在此位置打开cmd并使用此命令编译程序
javac JavaApplication3.java
编译完成后,向下导航一个目录,即C:\Java Projects\JavaApplication3\src
现在运行以下命令以执行程序
java javaapplication3.JavaApplication3
根据错误消息(“找不到或加载主类”),有两类问题:
找不到Main类无法加载Main类(在接受的答案中未充分讨论此情况)
当完全限定类名中存在拼写错误或语法错误,或者提供的类路径中不存在Main类时,找不到Main类。
当无法启动类时,无法加载Main类。通常,主类扩展另一个类,而该类不存在于提供的类路径中。
例如:
public class YourMain extends org.apache.camel.spring.Main
如果不包括骆驼弹簧,将报告此错误。
好吧,已经有很多答案了,但没有人提到文件权限可能是罪魁祸首。
运行时,用户可能无法访问JAR文件或路径的某个目录。例如,考虑:
/dir1/dir2/dir3/myjar.Jar中的Jar文件
拥有JAR文件的用户1可以执行以下操作:
# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar
但它仍然不起作用:
# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram
这是因为正在运行的用户(User2)无权访问dir1、dir2或javalibs或dir3。当User1可以看到文件并可以访问这些文件时,这可能会让某人发疯,但User2仍然会发生错误。