问题
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命令执行时,需要满足:
- 执行目录是包名最外层所在目录,如本例中demo文件夹所在目录;
- 类名需要包含整个包名, 如本例中的demo.HelloWorld