java 命令行执行class文件路径_命令行执行 class 文件的路径和包问题

在实际开发过程中,我们都是使用集成开发工具,很少使用命令行去执行 java 程序。今天在看书时,编写了书上的例子,照着书上使用命令行来执行(书上可能是为了简便),发现报错说找不到类文件,可是仔细检查类文件路径发现并没有问题。后来才知道原来是 java 命令对 class 文件的包名的强依赖原因造成的。自己重新写一遍,加深印象。

1. 报错详情

9831095cf30e5abfdad0fbac8b22c609.png

2. java 源文件路径

D:\project\onezai\ThinkingJavaDemo\src\oz\s2\s11\Train10.java

9728f7cfaee57a18077a7097333b537b.png

3. java 代码

packageoz.s2.s11;public classTrain10 {public static voidmain(String[] args){

System.out.println(args[0]);

System.out.println(args[1]);

System.out.println(args[2]);

}

}

4. 编译

进入到源文件的包目录下:D:\project\onezai\ThinkingJavaDemo\src\oz\s2\s11

编译成功,并生成了 class 文件:

290703511be8fee7bf89b4566af9ba89.png

5. 执行

76baad0fe10646aaf7d83ca4dfb6f16b.png

可以看到,报错了。可是明明 class 文件是存在的呀!

6. 分析

报错的原因就是,java 在加载 class 文件时,发现 class 文件声明的包名是 oz.s2.s11,而上述执行命令并没有指定包名,所以包名不匹配,就报错了。

正确的做法是,退出到包路径的最外层,然后使用 java oz.s2.s11.Train10 来执行,这个时候,java 会将点分的包名转化成路径,然后查找到 class 文件,而刚好的命令行传递的包名和找到的 class 文件声明的包名一致,这样就对上了,结果:

e2f8eca74bed2a4340baaeacbf58769f.png

7. 细思

既然我们知道了报错的原因是 命令行传入的包路径和找到的 class 声明的包路径不一致,那么假如我们现在非要在 D:\project\onezai\ThinkingJavaDemo\src\oz\s2\s11 路径下执行 Train10.class 文件,是不是只需要人为地创造一个相同的包路径就可以呢?答案是:是的。例如:

b097daf785166ac988a031e216f85ed8.png

只不过,我们现在执行的 class 文件是这个路径:D:\project\onezai\ThinkingJavaDemo\src\oz\s2\s11\oz\s2\s11

想想路径和包名的微妙关系,其实可以猜想:在前面的报错中 “找不到或无法加载主类”,应该是 “无法加载”,而不是 “找不到”。其实找应该是找到了,只是与找到的 class 文件声明的包名不一致,java 认为这样不合法,所以报错了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值