MacOS 下切换默认 Java (JDK)

TLDR

如果同时安装了 adoptopenjdk 11 和 adoptopenjdk 8,同时希望 8 做为默认 JDK,只需要把 /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Info.plist里的JVMVersion的值由1.8.0_222改为 x1.8.0_222(大概第42行)。这样我们的MacOS默认JDK就成为adoptopenjdk-8了。

查看 JDK 相关信息

macOS下 JDK 默认安装在 /Library/Java/JavaVirtualMachines目录下,同时提供了一个小工具/usr/libexec/java_home 帮助我们快速的查看 JDK 相关的信息。
默认情况下 MacOS 会自动的选择 /Library/Java/JavaVirtualMachines目录下版本号最高的 JDK 做为默认 JDK 。

查看当前 JDK 版本

查看当前 JDK 的安装目录

查看已安装的 JDK 版本及目录

查看所有

查看指定版本

可以通过/usr/libexec/java_home -v <version>来过滤版本号。 返回前缀匹配到的最新 JDK。

切换 JDK

使用指定的 JDK 执行单次命令

可以通过java_homeexec选项来执行单次任务。
/usr/libexec/java_home -v version --exec command

切换 Shell 的 JDK到指定版本

Shell 环境只需要指定一下JAVA_HOME环境变量就可以。

为了方便切换把以下别名配置粘到对应的 Shell 的配置文件 .bashrc 或 .zshrc,然后就可以方便的切换 JDK 版本了。

别名配置
需要根据自己实际已安装 JDK 做增减。

使用效果

切换 GUI 程序的默认 JDK

GUI 程序使用的默认 Java 也是 /usr/libexec/java_home -V 中看到的最高版本。

指定全局环境变量

创建setenv.javahome.plist并通过launchctl指定设置环境变量JAVA_HOME,需要注销再登录才生效。而且有些程序不兼容该方式。使用该方式之后,/usr/libexec/java_home的显示跟实际执行也会出现不一致。

生成 setenv.javahome.plist 并加载的脚本:

修改 JDK 版本号

我们还可以通过修改版本号实现指定版本的JDK做为默认JDK, 我目前正在使用该方式。

/usr/libexec/java_home是通过/Library/Java/JavaVirtualMachines/<JDK>/Contents/Info.plist里的JVMVersion值来获取版本号的,所以只需要修改这个值为当前最大版本号即可实现指定默认 JDK。经过测试这个还是即时生效。

像我安装过adoptopenjdk 11 ,但还是希望 adoptopenjdk 8做为默认 JDK,只需要把 /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Info.plist里的JVMVersion的值由1.8.0_222改为 x1.8.0_222(大概第42行)。这样我们的adoptopenjdk-8.jdk就变成最新版本的 JDK 了。

排序是通过 ASCII 值来排的,版本号只要改的比最新的 11 大都行,字符'x'的ASCII值远大于字符'1', 为了方便版本区分我只加了一个字符 x

修改完成之后再查看 JDK 信息,就会发现我们修改的x1.8.0_222会排到第一位,同时 Java version 是 1.8。

操作流程:
备份原始文件并打开,并使用 vim 编辑.

修改后的Info.plist文件差异

macOS 下 java 的真身

通过简单的探索,就能发现我们使用的 java 其实是软链到 /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java

greadlink 需要安装coreutils brew install coreutils

/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands 目录下的文件多是固定 38k 大小。猜测这些文件应该只是包装器,根据系统配置把命令转发给相应的 JDK 的对应命令。

评论关闭。