命令行执行 class 文件的路径和包问题
Posted coding-one
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了命令行执行 class 文件的路径和包问题相关的知识,希望对你有一定的参考价值。
在实际开发过程中,我们都是使用集成开发工具,很少使用命令行去执行 java 程序。今天在看书时,编写了书上的例子,照着书上使用命令行来执行(书上可能是为了简便),发现报错说找不到类文件,可是仔细检查类文件路径发现并没有问题。后来才知道原来是 java 命令对 class 文件的包名的强依赖原因造成的。自己重新写一遍,加深印象。
转自:使用 java 命令运行 class 文件报错找不到文件问题
1. 报错详情
2. java 源文件路径
D:projectonezaiThinkingJavaDemosrcozs2s11Train10.java
3. java 代码
package oz.s2.s11; public class Train10 { public static void main(String[] args){ System.out.println(args[0]); System.out.println(args[1]); System.out.println(args[2]); } }
4. 编译
进入到源文件的包目录下:D:projectonezaiThinkingJavaDemosrcozs2s11
编译成功,并生成了 class 文件:
5. 执行
可以看到,报错了。可是明明 class 文件是存在的呀!
6. 分析
报错的原因就是,java 在加载 class 文件时,发现 class 文件声明的包名是 oz.s2.s11,而上述执行命令并没有指定包名,所以包名不匹配,就报错了。
正确的做法是,退出到包路径的最外层,然后使用 java oz.s2.s11.Train10 来执行,这个时候,java 会将点分的包名转化成路径,然后查找到 class 文件,而刚好的命令行传递的包名和找到的 class 文件声明的包名一致,这样就对上了,结果:
7. 细思
既然我们知道了报错的原因是 命令行传入的包路径和找到的 class 声明的包路径不一致,那么假如我们现在非要在 D:projectonezaiThinkingJavaDemosrcozs2s11 路径下执行 Train10.class 文件,是不是只需要人为地创造一个相同的包路径就可以呢?答案是:是的。例如:
只不过,我们现在执行的 class 文件是这个路径:D:projectonezaiThinkingJavaDemosrcozs2s11ozs2s11
想想路径和包名的微妙关系,其实可以猜想:在前面的报错中 “找不到或无法加载主类”,应该是 “无法加载”,而不是 “找不到”。其实找应该是找到了,只是与找到的 class 文件声明的包名不一致,java 认为这样不合法,所以报错了。
以上是关于命令行执行 class 文件的路径和包问题的主要内容,如果未能解决你的问题,请参考以下文章
用命令行编译Java时遇到如下错误提示(该错误是在Class文件生成后,执行java命令时出现的)
在cmd命令行窗口怎样把.java文件编译成.class文件?java文件和class文件内部代码长什么样?.class文件如果想要被JVM加载,要求是什么?
Java中设置classpathpathJAVA_HOME的作用?
我在将java的.class文件打包成.jar文件后运行不了“Failed to load Main-Class”。怎么办?