管理JDK多个版本

MAC

mac 下我们使用/usr/libexec/java_home 来控制 jdk 版本的切换

1. 查看当前系统安装过哪些 JDK 版本(若不存在, 请先自行安装)

1
usr/libexec/java_home -V

结果如下(忽略安装了两个版本的 JDK1.8)

1
2
3
4
5
6
Matching Java Virtual Machines (4):
11.0.2 (x86_64) "Oracle Corporation" - "Java SE 11.0.2" /Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home
1.8.0_292 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 8" /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
1.8.0_102 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home
1.7.0_80 (x86_64) "Oracle Corporation" - "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home

2. 根据关键字查看 jdk 安装目录

1
/usr/libexec/java_home -v 11

结果如下

1
/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home

同样的, 查看 JDK8 如下

1
/usr/libexec/java_home -v 1.8

结果如下

1
/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

当如上命令正确执行无误的时候, 我们就可以开始来通过编辑环境变量来动态的进行改变 JDK 环境

3. 编辑~/.bash_profile(也许是.zshrc 等其他配置文件)

内容如下

1
2
3
4
5
6
7
8
9
10
# jdk
# 计算当前版本JDK的安装位置,因为在上面我们已经将2个JDK都放在了 /Library/Java/JavaVir tualMachines/
export JAVA_8_HOME=`/usr/libexec/java_home -v 1.8`
export JAVA_11_HOME=`/usr/libexec/java_home -v 11`

# 设置默认的环境是JDK11
export JAVA_HOME=$JAVA_11_HOME
# 添加两个别名,用来快速更好JDK环境
alias JDK8="export JAVA_HOME=$JAVA_8_HOME"
alias JDK11="export JAVA_HOME=$JAVA_11_HOME"

应用编辑过后的环境变量

1
source ~/.bash_profile

4. 切换 JDK 版本

执行完毕之后, 我们就可以使用别名来动态的切换 jdk 版本了, 如下

查看当前系统 jdk 版本

1
2
3
4
 ~ java -version
java version "11.0.2" 2019-01-15 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+9-LTS, mixed mode)

切换为 jdk8

1
~ JDK8

查看

1
2
3
4
 ~ java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.292-b10, mixed mode)

重新切换为 jdk11

1
~ JDK11

查看

1
2
3
4
 ~ java -version
java version "11.0.2" 2019-01-15 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+9-LTS, mixed mode)

至此, MAC 下多个版本的 JDK 管理脚本调整完毕


Linux

思路: 尝试过使用了上述的方式, 来动态调整 JAVA_HOME 的目录, 但是发现, PATH 内的 JAVA_HOME 没有动态获取改变后的目录, 因此尝试使用软连接的思路来动态改变 jdk 的目录.

失败案例

使用 ln -sf 把 jdk8 和 jdk11 指向同样的目录下, 第一次可以正常执行, 第二次执行的时候会进入到软连接的真实目录下创建一个软连接, 大家可以自行尝试, 也可能我的方式不对. 当然了, 也可以先删除, 后创建, 但是感觉略显麻烦.

1. 使用 alertnatives 创建软连接

jdk8

1
2
# 命令 --安装 软连接 名称 安装路径
alternatives --install /data/java java /data/jdk8 1

jdk11

1
2
# 命令 --安装 软连接 名称 安装路径
alternatives --install /data/java java /data/jdk11 2

2. 配置环境变量

1
2
3
4
5
# 执行软连接目录
export JAVA_HOME=/data/java

export PATH=${JAVA_HOME}/bin:${PATH}
export CLASSPATH=${JAVA_HOME}/lib:${CLASSPATH}

3. 切换 jdk 版本

  1. 手动选择切换
1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# alternatives --config java

共有 2 个提供“java”的程序。

选项 命令
-----------------------------------------------
+ 1 /data/jdk8
* 2 /data/jdk11

按 Enter 保留当前选项[+],或者键入选项编号:

  1. 命令直接切换

jdk11

1
[root@localhost ~]# alternatives --set java /data/jdk11

查看

1
2
3
4
[root@localhost ~]# java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

jdk8

1
[root@localhost ~]# alternatives --set java /data/jdk8

查看

1
2
3
4
[root@localhost ~]# java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)

这种方式有一种弊端, 就是切换的时候是全局的, 当多人访问该服务器, 一个人切换了软连接, 那所有人都会跟着变了当前的 jdk 版本

后续

当然前面那种通过更改环境变量的方式, 也可以通过更改 PATH 来实现

1
2
3
alias JDK8="export JAVA_HOME=/data/jdk8 && export PATH=/data/jdk8/bin:${M2_HOME}/bin:${PATH} && export CLASSPATH=/data/jdk8/lib:${CLASSPATH}"

alias JDK11="JAVA_HOME=/data/jdk11 && PATH=$/data/jdk8/bin:${M2_HOME}/bin:${PATH} && CLASSPATH=$/data/jdk8/lib:${CLASSPATH}"

但是该方式可能会导致 PATH 变的很长, 如果 PATH 本身不是很长, 可以考虑把 PATH 路径写完整, 不持续拼接上一个 PATH