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

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

    转自:使用 java 命令运行 class 文件报错找不到文件问题

 

1. 报错详情

   

 

 

2. java 源文件路径

  D:\project\onezai\ThinkingJavaDemo\src\oz\s2\s11\Train10.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:\project\onezai\ThinkingJavaDemo\src\oz\s2\s11

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

    

 

 

5. 执行

  

 

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

 

6. 分析

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

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

    

 

 

7. 细思

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

  

 

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

 

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

  

posted @ 2020-04-29 00:18  不爱刺猫的鱼  阅读(564)  评论(0编辑  收藏  举报