背景
最近突发奇想,想在终端用一个命令就能切换jdk版本,全程不用手动修改JAVA_HOME环境变量,例如:
EricTheRed@EricTheRed-MacBook-Pro ~ $ jdk17
EricTheRed@EricTheRed-MacBook-Pro ~ $ java -version
openjdk version "17.0.5" 2022-10-18
OpenJDK Runtime Environment Homebrew (build 17.0.5+0)
OpenJDK 64-Bit Server VM Homebrew (build 17.0.5+0, mixed mode, sharing)
EricTheRed@EricTheRed-MacBook-Pro ~ $ jdk8
EricTheRed@EricTheRed-MacBook-Pro ~ $ java -version
openjdk version "1.8.0_345"
OpenJDK Runtime Environment (build 1.8.0_345-bre_2022_08_04_23_33-b00)
OpenJDK 64-Bit Server VM (build 25.345-b00, mixed mode)
思路
openjdk的各个版本具有几乎相同的文件结构,很容易发现其JAVA_HOME环境变量最后都以/openjdk.jdk/Contents/Home结尾;
那么,可以通过设置JAVA_HOME环境变量为指向openjdk.jdk的链接文件(mac系统中也叫替身,windows系统可以理解为快捷方式),再设置一组命令用来更改这个链接指向的实际文件夹,就可以实现上述效果了。
实现
修改用户目录下.zshrc文件(如果使用的是bash,则修改.bash_profile文件),添加以下规则:
## JAVA config 在此处定义JAVA_HOME环境变量
export OPEN_JDK_DIR=/usr/local/opt
export JAVA_HOME=$OPEN_JDK_DIR/openjdk.jdk/Contents/Home
export PATH=$PATH:$JAVA_HOME
## JAVA 8 location 替换实际的JAVA 8 openjdk.jdk文件路径
export JAVA_HOME_8=/usr/local/Cellar/openjdk@8/1.8.0+345/libexec/openjdk.jdk
##JAVA 11 location 替换实际的JAVA 11 openjdk.jdk文件路径
export JAVA_HOME_11=/usr/local/Cellar/openjdk@11/11.0.16.1_1/libexec/openjdk.jdk
##JAVA 17 location 替换实际的JAVA 17 openjdk.jdk文件路径
export JAVA_HOME_17=/usr/local/Cellar/openjdk@17/17.0.5/libexec/openjdk.jdk
##JAVA 19 location 替换实际的JAVA 19 openjdk.jdk文件路径
export JAVA_HOME_19=/usr/local/Cellar/openjdk/19/libexec/openjdk.jdk
##Switch jdk commands 切换jdk版本的命令,例如jdk8的操作即为
##在$OPEN_JDK_DIR目录下创建一个JAVA 8 jdk的openjdk.jdk目录链接,下同
alias jdk8="ln -fs $JAVA_HOME_8 $OPEN_JDK_DIR"
alias jdk11="ln -fs $JAVA_HOME_11 $OPEN_JDK_DIR"
alias jdk17="ln -fs $JAVA_HOME_17 $OPEN_JDK_DIR"
alias jdk19="ln -fs $JAVA_HOME_19 $OPEN_JDK_DIR"
##zsh initilization:default use java8 默认每次打开zsh都使用java8,可以在此自定义
ln -fs $JAVA_HOME_8 $OPEN_JDK_DIR