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

温故而知新——手动运行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              .
2018/12/29  16:08              ..
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类)