温故而知新——手动运行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个细节。
- 我们忽略了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用多了就会这样。基础的东西必须要牢记,温故而知!