继承抽象类的Java主类运行报错:无法找到或加载主类
遇到这种编译成功但运行找不到主类的情况,大概率是类路径配置或者运行环境的问题,我给你梳理几个排查和解决的关键点:
检查当前工作目录与类文件位置
编译完成后,MyMainClass.class文件应该和你的.java源文件在同一目录(如果没指定-d参数的话)。运行java命令时,你必须处于这个包含.class文件的目录下,否则JVM找不到它。比如你在/home/code目录下编译的,那就要先cd到/home/code,再执行java MyMainClass。运行时必须包含依赖的Jar包
因为你的MyMainClass继承了Jar包里的抽象类LibClass,编译时你已经通过javac -cp your-lib.jar MyMainClass.java指定了Jar路径,但运行时同样需要把这个Jar加入类路径,否则JVM不仅找不到父类,还可能连带报错找不到主类。正确的运行命令应该是:- 类Unix系统(Linux/Mac):
java -cp .:your-lib.jar MyMainClass(注意.代表当前目录,:用来分隔多个类路径项) - Windows系统:
java -cp .;your-lib.jar MyMainClass(Windows用;代替:作为分隔符)
- 类Unix系统(Linux/Mac):
确认main方法的签名完全正确
有时候编译能通过,但main方法签名不符合JVM要求,也会被判定为“找不到主类”。请确保你的main方法是这样的:public static void main(String[] args) { // 你的代码逻辑 }注意
public、static、void三个修饰符一个都不能少,参数必须是String[]类型(哪怕你不用args参数),参数名可以自定义,但类型不能错。排查是否有编译输出目录的问题
如果你编译时用了javac -d ./classes MyMainClass.java指定了编译输出到classes目录,那运行时需要把这个目录加入类路径,命令就是java -cp ./classes:your-lib.jar MyMainClass(Windows同理换成;)。
内容的提问来源于stack exchange,提问作者arandomuser

