• 命令行执行 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 认为这样不合法,所以报错了。

      

  • 相关阅读:
    [转载]自定义Behavior 实现Listbox自动滚动到选中项
    [转载]使用Express3.0实现<Node.js开发指南>中的微博系统
    【转载】Node.js + Express 多个 Layout 文件应用
    [转载]node.js之 express框架+ejs模板 windows下建站点
    微软中国软件下载中心
    {转载}【真正的Expression Blend实战开发技巧】
    [转载]WPF窗口跳转及window和page区别
    paip.java c++得到当前类,方法名称以及行号
    paip.简化字手写参考二简字..共98个
    paip.文件读写api php java python总结.txt
  • 原文地址:https://www.cnblogs.com/coding-one/p/12799344.html
Copyright © 2020-2023  润新知