如果已经使用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
)
下面是流程:
- 当我们已经使用pkg安装了一个jdk8时,执行
/usr/libexec/java_home -v1.8
,会输出/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home
,这表明pkg的jdk会默认被安装到此目录。 - 使用brew安装open jdk11,执行
brew install openjdk@11
。 - 安装成功后,依照提示添加软链,
sudo ln -sfn /usr/local/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk
。 - 检查是否成功,执行
/usr/libexec/java_home -v11
,此时输出/Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home
。 - 为两个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需要关闭然后再打开。