如何在MacOS上切换多个JDK版本 Mac下Java多版本管理方法

通过配置别名或使用jEnv实现MacOS下多JDK版本快速切换,提升Java开发效率。

在MacOS上开发Java项目时,经常需要在不同JDK版本之间切换,比如JDK 8、JDK 11和JDK 17。手动修改环境变量太麻烦,下面介绍几种高效又简单的多JDK版本管理方法。

使用命令行快速切换JDK版本

MacOS自带了/usr/libexec/java_home工具,可以列出已安装的JDK并生成对应路径,配合JAVA_HOME环境变量实现快速切换。

先查看当前系统中所有已安装的JDK:

/usr/libexec/java_home -V

终端会输出类似内容(版本可能不同):

Matching Java Virtual Machines (3):
    17.0.1, x86_64:	"OpenJDK 17"	/Library/Java/JavaVirtualMachines/openjdk-17.jdk/Contents/Home
    11.0.15, x86_64:	"OpenJDK 11"	/Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home
    1.8.0_345, x86_64:	"AdoptOpenJDK 8"	/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

根据输出结果,通过设置JAVA_HOME来切换版本,例如切换到JDK 11:

export JAVA_HOME=$(/usr/libexec/java_home -v 11)

切换到JDK 17:

export JAVA_HOME=$(/usr/libexec/java_home -v 17)

验证是否切换成功:

java -version

配置别名简化切换操作

每次输入完整命令很麻烦,可以在shell配置文件中添加别名。

打开你的shell配置文件,如:

  • Zsh用户:编辑~/.zshrc
  • Bash用户:编辑~/.bash_profile~/.bashrc

添加以下别名:

alias j8='export JAVA_HOME=$(/usr/libexec/java_home -v 1.8); java -version'
alias j11='export JAVA_HOME=$(/usr/libexec/java_home -v 11); java -version'
alias j17='export JAVA_HOME=$(/usr/libexec/java_home -v 17); java -version'
alias j21='export JAVA_HOME=$(/usr/libexec/java_home -v 21); java -version'

保存后执行重新加载:

source ~/.zshrc

之后只需输入j11就能一键切换到JDK 11,并显示当前版本。

使用JEnv管理多版本(可选进阶方案)

jEnv是一个专门用于管理Java版本的开源工具,适合需要频繁切换或按项目绑定JDK的场景。

安装jEnv(推荐使用Homebrew):

brew install jenv

将jEnv加入shell环境:

echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc
source ~/.zshrc

将已安装的JDK添加到jEnv:

jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/openjdk-17.jdk/Contents/Home

查看可用版本:

jenv versions

全局切换JDK:

jenv global openjdk64-11.0.15

为某个项目单独设置JDK:

cd /your/java/project
jenv local openjdk64-17.0.1

这样进入该目录时会自动使用指定版本,非常方便团队协作。

基本上就这些。用/usr/libexec/java_home加别名是最轻量的方法,适合大多数开发者;如果项目多、版本切换频繁,可以考虑jEnv。关键是把常用操作简化,避免重复劳动。