解决Linux下java命令报错Error:Couldn

问题

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