最近进行开发的时候, 遇到了一些不同 JDK 版本的需求: Spring Boot 2 的开发框架 eladmin-plus 只能使用 JDK 8; 新版本的 Flutter SDK 配置 Android Toolchain 时最低要求 JDK 11; 而最新版的 Spring Boot 最低的 JDK 版本是 JDK 17

想在同一台电脑完成上面的开发, 比较好的作法当然是在一台电脑上安装多个版本的 JDK, 根据需要随时进行切换。

安装版和解压版 JDK

安装版的 JDK 会添加一些环境变量到电脑中, 如果这些环境变量不进行处理, 会对切换后的其他版本JDK 造成影响, 所以在 Windows 中同地安装多个版本的 JDK时, 建议使用解压版

现在 Oracle 已经不提供解压版的JDK了, 所以要自己进行制作。

制作解压版的 Oracle JDK

  1. 下载安装各版本JDK(例如 JDK 8, JDK11, JDK17等) 的安装程序

  2. 运行安装程序, 参考下图的步骤, 复制 JDK 到另一个位置

  1. 复制出来的就是我们需要的解压版JDK, 复制成功后, 取消当前JDK的继续安装。

  2. 重复以上步骤获取其他版本的 JDK文件

可以把其他电脑已经安装好的JDK文件夹复制出来使用即可

Open JDK - 另一种选择

Open JDK 大部分都是解压版, 如果可以接受 Open JDK 的话, 则直接下载回来解压就可以使用了。 比如Microsoft 维护的 OpenJDK:
https://learn.microsoft.com/zh-cn/java/openjdk/download

如果电脑有安装 Android Studio, 会自带有一个 OpenJDK, 也可以把这个 JDK 复制出来使用。

我在当前电脑准备了四个解压版本的JDK, 将其放在 d:\AppData 文件夹下, 解压版的软件在重装操作系统后也可以直接使用, 所以放在D盘的文件夹比较好, 如下图:

  • jdk1.8.0_333: 使用安装程序按照上面制作方法复制出来的 Oracle JDK 8, 将复制出来的文件夹改名;

  • openjdk1.8.0_242: 旧版Android Studio 3.5 自带的OpenJDK, 将其安装文件夹的 jre 文件夹复制出来并改名;

  • openjdk11.0.12: Android Studio 2020.3.1 自带的OpenJDK, 将其安装文件夹的 jre 文件夹复制出来并改名;

  • openjdk17.0.2 : 直接从 Microsoft 下载并解压并改名的 OpenJDK

之所以有这么多个, 只是为了把获取解压版 JDK 的方法都试一次

系统环境变量设置

编辑系统环境变量 path, 添加以下两个值:

  1. %JAVA_HOME%\bin

  2. %JAVA_HOME%\jre\bin

如下图所示:

使用或切换不同版本的 JDK

以上已经准备好的四个JDK 的路径分别为:

D:\AppData\jdk1.8.0_333

D:\AppData\openjdk1.8.0_242

D:\AppData\openjdk11.0.12

D:\AppData\openjdk17.0.2

只需要将相应的路径添加到系统环境变量 JAVA_HOME 中即可使用该版本的 JDK

为更方便进行切换, 可以使用命令的方式来添加或修改环境变量的值, 命令格式: setx "环境变量名" "环境变量值"

使用管理员权限打开 CMD窗口PowerShell窗口,执行以下命令:

1
setx "JAVA_HOME" "D:\AppData\openjdk17.0.2" /m

命令行后的参数 /m 表示添加为 系统 环境变量, 没有该参数量为用户环境变量

只需要将 D:\AppData\openjdk17.0.2 替换为其他路径并重复执行以上命令即可实现 JDK 版本的切换

切换版本后, 要在新打开的命令窗口中才能查看到切换后 java 版本

命令执行结果如下所示:

1
2
3
PS C:\Users\hujy> setx "JAVA_HOME" "D:\AppData\openjdk17.0.2" /m

成功: 指定的值已得到保存。

已经添加成功的 JAVA_HOME 环境变量

查看 Java 版本信息

1
2
3
4
PS C:\Users\hujy> java -version
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-86)
OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)