当你运行java或者 Java 程序时使用的是哪个 JDK 呢?在 OS X 下,java也就是/usr/bin/java在默认情况下指向的是已经安装的最新版本。但是你可以设置环境变量JAVA_HOME来更改其指向:
# 查看当前的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中的任意一个。
$ 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)
配置命令自动切换
修改/etc/profile或者 在/.bash_profile(如果是Zsh,修改/.zshrc)文件中添加如下内容:
# 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 #默认JDK 8
#alias命令动态切换JDK版本
alias jdk6="export JAVA_HOME=$JAVA_6_HOME"
alias jdk8="export JAVA_HOME=$JAVA_8_HOME"
$ source ~/.bash_profile
说明:Mac系统的环境变量,加载顺序为:
/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
原理
当你安装 jdk 完成,进入 /Library/Java/JavaVirtualMachines 目录你会看到相应 jdk 文件夹的存在。当你安装了多版本 jdk 时,它们同时存在于这个目录下。
那么你使用的 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
可见苹果公司在开发 macOS 时已经内置了 jdk 版本管理的功能。它也提供了相应的 command line 工具。使用 /usr/libexec/java_home 即可直接查看当前的 $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