解决Linux下java命令报错Error: Could not find or load main class

3,396 阅读1分钟

问题

HelloWorld代码如下

package demo;

public class HelloWorld {
    public static void main(String[] args) {
            System.out.println("hello , linux world!");
    }
}

很简单的程序 首先编译

javac HelloWorld.java

一切顺利没有报错 查看当前目录,也生成了HelloWorld.class文件

使用java命令执行:

java HelloWorld

报错了:

Error: Could not find or load main class HelloWorld

查看了很多资料,有一些说法是javac应该指定包含包名的全限定类名,我们先反编译一下.class文件

javap HelloWorld.class

得到的结果如下: 发现确实是有全限定类名demo.HelloWorld

继续尝试

java demo.HelloWorld

发现依旧报同样的错误 这个时候就麻烦了,继续查阅资料,给出的思路是classPath有问题,于是在命令上添加classPath为当前文件夹:

java -classpath . demo.HelloWorld

然而还是不行

既然包名有问题,那我们把包名去掉呢 修改java文件,删除掉第一行的

package demo;

重新执行,发现没有问题 那么添加包名后,为什么在类所在目录执行不了 我们尝试到包名demo的同级目录执行

java -classpath ../ demo.HelloWorld

这次终于成功了: 将目录切换到上层,也可以成功执行

总结

带有包名的class文件使用java命令执行时,需要满足:

  1. 执行目录是包名最外层所在目录,如本例中demo文件夹所在目录;
  2. 类名需要包含整个包名, 如本例中的demo.HelloWorld