活到老学到老之使用jenv管理多个java版本

我本地安装的java版本是1.8

bash 复制代码
testmanzhang@TestMandeMacBook-Pro ~ % /usr/libexec/java_home -v 1.8
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home

这个版本不是通过 JDK 安装的,是 Java Applet Plugin(浏览器用的 Java 运行环境),并不是完整的 JDK。

删除当前版本

bash 复制代码
testmanzhang@TestMandeMacBook-Pro ~ % sudo rm -rf "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin"
bash 复制代码
testmanzhang@TestMandeMacBook-Pro ~ % sudo rm -rf  /Library/Java/JavaVirtualMachines/jdk1.8.0_401.jdk

检查是否删除成功

bash 复制代码
java -version
javac -version
/usr/libexec/java_home -V

安装java 8(Temurin 版)

bash 复制代码
brew install --cask temurin@8

安装完成后检查

bash 复制代码
/usr/libexec/java_home -V

安装 Java 21

bash 复制代码
brew install openjdk@21

安装完成后执行/usr/libexec/java_home -V,但只有1.8的信息:

bash 复制代码
==> Pouring openjdk@21--21.0.8.sonoma.bottle.tar.gz
==> Caveats
For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /usr/local/opt/openjdk@21/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-21.jdk

openjdk@21 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have openjdk@21 first in your PATH, run:
  echo 'export PATH="/usr/local/opt/openjdk@21/bin:$PATH"' >> ~/.zshrc

For compilers to find openjdk@21 you may need to set:
  export CPPFLAGS="-I/usr/local/opt/openjdk@21/include"
==> Summary
🍺  /usr/local/Cellar/openjdk@21/21.0.8: 600 files, 330.4MB
==> Running `brew cleanup openjdk@21`...
Disable this behaviour by setting `HOMEBREW_NO_INSTALL_CLEANUP=1`.
Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
==> No outdated dependents to upgrade!
==> Caveats
==> openjdk@21
For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /usr/local/opt/openjdk@21/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-21.jdk

openjdk@21 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have openjdk@21 first in your PATH, run:
  echo 'export PATH="/usr/local/opt/openjdk@21/bin:$PATH"' >> ~/.zshrc

For compilers to find openjdk@21 you may need to set:
  export CPPFLAGS="-I/usr/local/opt/openjdk@21/include"
testmanzhang@TestMandeMacBook-Pro ~ % nano ~/.zshrc
testmanzhang@TestMandeMacBook-Pro ~ % 
testmanzhang@TestMandeMacBook-Pro ~ % 
testmanzhang@TestMandeMacBook-Pro ~ % 
testmanzhang@TestMandeMacBook-Pro ~ % 
testmanzhang@TestMandeMacBook-Pro ~ % 
testmanzhang@TestMandeMacBook-Pro ~ % /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
    1.8.0_462 (x86_64) "Eclipse Temurin" - "Eclipse Temurin 8" /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home
testmanzhang@TestMandeMacBook-Pro ~ % 

按照提示执行:

bash 复制代码
sudo ln -sfn /usr/local/opt/openjdk@21/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-21.jdk

使用jenv管理java版本的话不用执行:

bash 复制代码
echo 'export PATH="/usr/local/opt/openjdk@21/bin:$PATH"' >> ~/.zshrc

编辑~/.zshrc,在文件顶部添加

bash 复制代码
export PATH="$HOME/.jenv/shims:$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"

同时注释掉原有的java环境变量:

bash 复制代码
#JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home"
#PATH=$JAVA_HOME/bin:$PATH:.
#CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
#export JAVA_HOME
#export PATH
#export CLASSPATH

保存后,执行:

bash 复制代码
source ~/.zshrc

之后这步很关键,就是要重启终端

bash 复制代码
testmanzhang@TestMandeMBP ~ % which java
/Users/testmanzhang/.jenv/shims/java

不然:

bash 复制代码
testmanzhang@TestMandeMBP ~ % which java
/usr/bin/java

which java 指向了 ~/.jenv/shims/java,说明 jenv 正常工作

之后添加java版本

bash 复制代码
jenv add /usr/local/Cellar/openjdk@21/21.0.8/libexec/openjdk.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home

之后rehash

bash 复制代码
testmanzhang@TestMandeMBP ~ % jenv rehash

jenv命令

bash 复制代码
testmanzhang@TestMandeMBP ~ % jenv doctor
[OK]	No JAVA_HOME set
[OK]	Java binaries in path are jenv shims
[OK]	Jenv is correctly loaded
bash 复制代码
testmanzhang@TestMandeMBP ~ % jenv versions

* system (set by /Users/testmanzhang/.jenv/version)
  1.8
  1.8.0.462
  21
  21.0
  21.0.8
  openjdk64-21.0.8
  temurin64-1.8.0.462
testmanzhang@TestMandeMBP ~ % 

使用jenv global 切换不同的版本

bash 复制代码
testmanzhang@TestMandeMBP ~ % jenv global 21.0.8
testmanzhang@TestMandeMBP ~ % jenv rehash
testmanzhang@TestMandeMBP ~ % java -version
openjdk version "21.0.8" 2025-07-15
OpenJDK Runtime Environment Homebrew (build 21.0.8)
OpenJDK 64-Bit Server VM Homebrew (build 21.0.8, mixed mode, sharing)