今年下午偶然间想起当初刚学 java 时用过 javac 指令编译本地的源码, 再用 java 指令运行编译好的 class 文件, 于是又在本地试了一下, 没成想翻了车, 后多方查阅尝试才找到问题根源所在.
首先我是随便进了一个 idea 项目中的包目录下, 以该目录为基础, 调出来 cmd 指令控制台, 如下图所示:
然后我 javac 编译了 YanJing.java 文件, 再调用 java 指令对其进行执行
就报错了, 看网上有人说是环境变量 classpath 的原因, 改成.; 后用 java YanJing 还是不行, 后来才知道, 在用 java 指令运行 class 文件时, class 文件名不只是类名, 还要带上类的包路径, 组起来就是
类的全路径名. 联想到因为在虚拟机中是用类的全路径跟类加载器来唯一标识一个类的, class 文件是与类的全路径名绑定而非类名 (个人猜测可能是在编译成 class 文件时就将全路径名给设置好了,
当再次虚拟机去读取 class 文件时就用指令中的全路径名匹配 class 文件的全路径名, 但是查阅了一下 JVM 编译的地方, 未找到这种说明, 所以只能先个人猜测一下). 故此处用 java com.paradise.testDataSource.YanJing, 但还是一样的报错. 因为漏了一点 --- 包的路径. 当在当前目录下的 cmd 中执行 java 命令运行 class 文件时, 系统会首先通过环境变量的
CLASSPATH 来进行目录的重定向 (如果 CLASSPATH 值设置为.; 则是默认为当前路径), 然后以当前路径为基础拼接上包路径, 找最后全路径名为名称的 class 文件. 所以此处要将
class 文件放入当前目录下的 com/paradise/testDataSource 目录下
确认一下 classpath 设置为当前路径 (classpath 改变后, 需要将 cmd 关闭重新打开), 再执行一下 java 指令
到此问题解决, Done.
看来今年有必要将 JVM 编译一章好好研读一番了...
来源: https://www.cnblogs.com/zzq6032010/p/10230135.html