美文网首页
温故而知新——手动运行java类

温故而知新——手动运行java类

作者: alex_jiang | 来源:发表于2018-12-29 16:38 被阅读5次

    温故而知新——手动运行java类

    开发很多年了,突然遇到一个需求。编写dockerfile,手动编译java文件并运行。以为很简单,却遇到了一些坑。

    java -version
    java version "1.8.0_192"
    Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
    

    编写java源代码并编译

    Demo.java类

    package com.demo;
    
    /**
     * @Title: Demo
     * @ProjectName java_worker_demo
     * @Description: TODO
     * @Author jiangwei121
     * @Date 2018/12/2914:33
     */
    public class Demo {
        public static void main(String[] args) {
            System.out.println("Hello");
        }
    }
    

    编译Demo.java类
    执行javac编译源代码,在当前目录生成Demo.class文件,如下:

    D:\Projects\esclient6.xdemo\java_worker_demo\src\main\java\com\demo>javac Demo.java
    
    D:\Projects\esclient6.xdemo\java_worker_demo\src\main\java\com\demo>dir
     驱动器 D 中的卷是 NewDisk
     卷的序列号是 80BB-9CDF
    
     D:\Projects\esclient6.xdemo\java_worker_demo\src\main\java\com\demo 的目录
    
    2018/12/29  16:08    <DIR>          .
    2018/12/29  16:08    <DIR>          ..
    2018/12/29  09:11             1,106 App.java
    2018/12/29  09:13             1,270 BookHandler.java
    2018/12/29  16:08               416 Demo.class
    2018/12/29  15:11               270 Demo.java
                   4 个文件          3,062 字节
                   2 个目录 382,118,637,568 可用字节
    
    

    执行编译后Demo.class文件

    调用java命令执行Demo.class文件发现有错误,错误信息如下:

    D:\Projects\esclient6.xdemo\java_worker_demo\src\main\java\com\demo>java Demo.class
    错误: 找不到或无法加载主类 Demo.class
    
    

    正确的方式执行class文件:
    为什么上面的命令会报错,现在错误信息是“找不到或无法加载主类”。回忆一下java的运行机制。

    其实原因很简单,我们忽略了1个细节。

    1. 我们忽略了package的影响。

    Demo类的包路径是com.demo

    所以,我们应该这样执行:

    D:\Projects\esclient6.xdemo\java_worker_demo\src\main\java\com\demo>cd ../../
    
    D:\Projects\esclient6.xdemo\java_worker_demo\src\main\java>java com.demo.Demo
    Hello
    

    总结:

    一、java执行class文件是根据CLASSPATH指定的地方来找,不是我们理解当前目录。
    二、java执行class文件对package的路径是强依赖的。它在执行的时候会严格以当前用户路径为基础,按照package指定的包路径转化为文件路径去搜索class文件。

    IDE用多了就会这样。基础的东西必须要牢记,温故而知!

    相关文章

      网友评论

          本文标题:温故而知新——手动运行java类

          本文链接:https://www.haomeiwen.com/subject/hncplqtx.html