为什麽也需要有 CLASSPATH 呢?

前一篇提到,我们在聊 PATH 是说电脑要知道可以执行 java 指令的程序放在哪里(路径),
那 CLASSPATH 呢?

前几篇有说到,JVM 只看得懂 .class,java 指令就是在启动 JVM,
当执行 java 指令时,JVM 也会根据当下的程序目录去寻找 .class档,但如果找不到 .class 档,
就会发生下面的状况
https://ithelp.ithome.com.tw/upload/images/20210905/20106215Xwu3jXw2Ku.png

但我们可以手动去设定 CLASSPATH,告诉 JVM .class 放在哪里,java -classpath {路径} 或是简写 java -cp {路径} 就像:
https://ithelp.ithome.com.tw/upload/images/20210905/20106215KoQgRzmPwR.png

一样也可以执行我们第二天的范例类别哦!

但是这样每次想执行 java 指令的时候都要特地写上 -cp or -classpath 去做设定太麻烦了,
如果是很常用的路径,也可以透过设定环境变数 CLASSPATH ,设定一次之後不管在哪个目录下都可以用了!
https://ithelp.ithome.com.tw/upload/images/20210905/20106215t4yCBn5MjR.png

我们来整理一下 PATH 跟 CLASSPATH 两个的差别~

作业系统 搜寻路径 可执行档
Windows、Mac OS PATH .exe、.bat、Unix执行档
JVM CLASSPATH .class

而且还有一件事情,我们是透过 javac 的指令来进行编译产生 .class 档案,
如果程序码里面有使用到其他的类别程序的时候,也要指定 CLASSPATH,
让 javac 编译器知道要去哪里寻找额外使用的类别哦!

下面就来模拟一下上述说的情境吧!

我有两个 .java 档案 分别内容为:
https://ithelp.ithome.com.tw/upload/images/20210906/20106215Palwn4nNUt.png

目录结构如下
https://ithelp.ithome.com.tw/upload/images/20210906/20106215NqTHPQTTxp.png

Step 1 : 先建立 Utils.class :

https://ithelp.ithome.com.tw/upload/images/20210906/20106215El8EmOi2Et.png

Step 2 : 再建立 MyHelloWorld.class :

却说找不到我的 Utils.class
https://ithelp.ithome.com.tw/upload/images/20210906/20106215JJr88F0Wwt.png

这时候就要设定 CLASSPATH ,再执行一次!
javac -cp classes MyHelloWorld.java
https://ithelp.ithome.com.tw/upload/images/20210906/20106215BPSr6X6Jmw.png

Step 3 : 执行 java MyHelloWorld

结果又错了,又跟我说找不到 Utils.class
https://ithelp.ithome.com.tw/upload/images/20210906/20106215v3apBUG5PB.png

这时候就要设定 CLASSPATH ,再执行一次!
java -cp .:classes MyHelloWorld
https://ithelp.ithome.com.tw/upload/images/20210906/20106215ism81GXuDP.png

step 2 是针对 javac
step 3 是针对 java(JVM),
他们对象不同哦~


<<:  Day5 休息一日思考下一步

>>:  从 JavaScript 角度学 Python(5) - 函式

予焦啦!产出可执行档

本节是以 Golang 上游 1a708bcf1d17171056a42ec1597ca8848c...

EP 25 - [Ruby on Rails] 更新订单付款状态

Youtube 频道:https://www.youtube.com/c/kaochenlong ...

D28 - 如何打包 Apps Script 的程序码?(一) 变成扩充功能似的 UI 按键

今天的目标 要怎麽将我们的 GAS 成果打包成别人可以使用的版本?我们已经学了快一个月的 GAS 使...

Youtube Data API 教学 - 那就从播放清单 playlistItems.list

「鲑鱼均,因为一场鲑鱼之乱被主管称为鲑鱼世代,广义来说以年龄和脸蛋分类的话这应该算是一种 KNN 的...

[Day 6] .Net WhenAll 底层(1)

前言 这系列教学文的目的是要探索具备非同步功能的框架在底层发生了什麽事, 甚至写一个简单的框架出来,...