如果已经使用pkg方式安装过了jdk(这种方式安装后直接可用,可执行 java -version ),默认会将jdk安装到系统目录,这样java_home就能直接识别出所有已经安装过的jdk,但是如果使用brew等工具,下载的是二进制/压缩包,则需要配置一些环境变量。

比如,brew安装open jdk11时,安装完后就会提醒是否添加软链到系统目录: sudo ln -sfn /usr/local/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk

如果不添加软链则 /usr/libexec/java_home -v11 是无效的,会提示找不到jdk11(因为系统的Library目录没有),此时虽然能使用 java 命令( java -version 版本为11),但是并不方便我们动态切换jdk版本,并且会覆盖 /Library/Java/JavaVirtualMachines 中的其他jdk。

如果不使用软链,则需要找到原始安装位置,时间久了可能就会忘记,放到系统默认的管理位置,不容易出问题。 /usr/libexec/java_home 展示的是安装目录,而不是 whereis java 找到的java可执行命令的目录( /usr/bin/java

下面是流程:

  1. 当我们已经使用pkg安装了一个jdk8时,执行 /usr/libexec/java_home -v1.8 ,会输出 /Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home ,这表明pkg的jdk会默认被安装到此目录。
  2. 使用brew安装open jdk11,执行 brew install openjdk@11
  3. 安装成功后,依照提示添加软链, sudo ln -sfn /usr/local/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk
  4. 检查是否成功,执行 /usr/libexec/java_home -v11 ,此时输出 /Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home
  5. 为两个jdk设置环境变量:
# 计算当前版本JDK的安装位置,因为在上面我们已经将2个JDK都放在了 /Library/Java/JavaVirtualMachines/
export JAVA_8_HOME= `/usr/libexec/java_home -v 1.8`
export JAVA_11_HOME= `/usr/libexec/java_home -v 11`
# 设置默认的环境是JDK8
export JAVA_HOME=$JAVA_8_HOME  
# 添加两个别名,用来快速更改JDK环境  
alias JDK8="export JAVA_HOME=$JAVA_8_HOME"  
alias JDK11="export JAVA_HOME=$JAVA_11_HOME"

测试:

执行 JDK8 ,输出:

java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

执行 JDK11 ,输出:

openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment (build 11.0.7+10)
OpenJDK 64-Bit Server VM (build 11.0.7+10, mixed mode)

如果是IDEA环境,切换JDK后,terminal需要关闭然后再打开。