當(dāng)你運(yùn)行java或者 Java 程序時(shí)使用的是哪個(gè) JDK 呢?在 OS X 下,java也就是/usr/bin/java在默認(rèn)情況下指向的是已經(jīng)安裝的最新版本。但是你可以設(shè)置環(huán)境變量JAVA_HOME來更改其指向:
# 查看當(dāng)前的java版本
$ java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
# 切換版本,可切換為第三步的本地java home中的任意一個(gè)。
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home java -version
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-466.1-11M4716)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-466.1, mixed mode)
配置命令自動(dòng)切換
修改/etc/profile或者 在/.bash_profile(如果是Zsh,修改/.zshrc)文件中添加如下內(nèi)容:
# JDK 6
export JAVA_6_HOME="/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home"
# JDK 8
export JAVA_8_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home"
export JAVA_HOME=$JAVA_8_HOME #默認(rèn)JDK 8
#alias命令動(dòng)態(tài)切換JDK版本
alias jdk6="export JAVA_HOME=$JAVA_6_HOME"
alias jdk8="export JAVA_HOME=$JAVA_8_HOME"
$ source ~/.bash_profile
說明:Mac系統(tǒng)的環(huán)境變量,加載順序?yàn)椋?br> /etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
原理
當(dāng)你安裝 jdk 完成,進(jìn)入 /Library/Java/JavaVirtualMachines 目錄你會(huì)看到相應(yīng) jdk 文件夾的存在。當(dāng)你安裝了多版本 jdk 時(shí),它們同時(shí)存在于這個(gè)目錄下。
那么你使用的 java -version 做了什么?我們一步一步追蹤
which java
/usr/bin/java
ls -l /usr/bin/java
lrwxr-xr-x 1 root wheel 74 1 29 2019 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
cd /System/Library/Frameworks/JavaVM.framework/Versions
ls -l
drwxr-xr-x 8 root wheel 256 1 16 2019 A
lrwxr-xr-x 1 root wheel 1 1 29 2019 Current -> A
可見蘋果公司在開發(fā) macOS 時(shí)已經(jīng)內(nèi)置了 jdk 版本管理的功能。它也提供了相應(yīng)的 command line 工具。使用 /usr/libexec/java_home 即可直接查看當(dāng)前的 $JAVA_HOME
/usr/libexec/java_home -V
Matching Java Virtual Machines (2):
11.0.6, x86_64: "Java SE 11.0.6" /Library/Java/JavaVirtualMachines/jdk-11.0.6.jdk/Contents/Home
1.8.0_171, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-11.0.6.jdk/Contents/Home
usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk-11.0.6.jdk/Contents/Home
/usr/libexec/java_home -v1.8
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home