Windows系统下JDK 8与JDK 17双版本安装与灵活切换全攻略
2026/8/20 2:34:39 网站建设 项目流程

在实际 Java 开发中,我们常常会遇到一个棘手的问题:项目环境不统一。一个老旧的遗留系统可能要求使用 JDK 8 来编译和运行,而一个准备采用新特性的微服务项目则要求使用 JDK 17。如果只安装一个版本,来回卸载重装不仅麻烦,而且容易出错。因此,在 Windows 或 macOS 开发机上同时安装并配置多个 JDK 版本,并能在不同项目间灵活切换,是提升开发效率、避免环境冲突的必备技能。

本文将带你完成 JDK 8 和 JDK 17 在 Windows 系统下的双版本安装与配置全过程。我们会从官方渠道下载安装包,讲解如何正确设置系统环境变量,并重点介绍如何通过命令行工具或 IDE 配置,实现项目级别的 JDK 版本切换。无论你是需要维护历史项目的新手,还是需要在不同技术栈间切换的资深开发者,掌握这套方法都能让你的开发环境更加清晰、可控。

1. 理解多 JDK 并存的原理与常见误区

在开始动手之前,我们需要先厘清几个核心概念,这能帮助你理解后续每一步操作的目的,避免走入常见的配置陷阱。

1.1 JAVA_HOME、PATH 与命令行工具的关系

当你在命令行输入java -versionjavac时,操作系统是如何找到并执行这些命令的呢?这依赖于两个关键的环境变量:JAVA_HOMEPATH

  • JAVA_HOME:这是一个指向 JDK 安装根目录的环境变量。许多 Java 应用(如 Tomcat、Maven、Gradle)以及像 IntelliJ IDEA、Eclipse 这样的 IDE,都会读取JAVA_HOME变量来确定使用哪个 JDK。它本身不直接用于命令行查找。
  • PATH:这是一个由多个目录路径组成的列表,用分号分隔。当你在命令行输入一个命令(如java)时,操作系统会按照PATH中列出的目录顺序,依次查找是否存在名为java.exe的可执行文件。找到的第一个就会被执行。

通常,我们会将%JAVA_HOME%\bin(Windows)或$JAVA_HOME/bin(macOS/Linux)添加到PATH变量中。这样,当JAVA_HOME指向 JDK 8 时,PATH中的...\jdk1.8.0_XXX\bin路径生效,命令行使用的就是 JDK 8;当JAVA_HOME改为指向 JDK 17 时,命令行就会自动切换到 JDK 17。

常见误区:很多人只修改JAVA_HOME,却忘了检查PATH变量中是否残留了旧版本 JDK 的bin目录路径,并且其顺序在%JAVA_HOME%\bin之前,这会导致命令行版本与预期不符。

1.2 安装程序与环境变量管理

从 Oracle 或 Adoptium 等渠道下载的 JDK Windows 安装包(.exe 或 .msi),在安装过程中通常会询问是否“设置 JAVA_HOME 变量”或“添加到 PATH”。对于单版本安装,勾选这些选项很方便。但对于多版本并存,我们强烈建议在安装时取消所有这些自动配置选项。原因如下:

  1. 避免冲突:安装程序会自动将新 JDK 的bin路径添加到PATH的最前面,这会直接覆盖你之前精心配置的路径顺序。
  2. 失去控制权:自动设置的JAVA_HOME会被固定为最后一次安装的 JDK 路径,你无法灵活切换。
  3. 难以排查:当环境出现问题时,自动添加的、分散在各处的路径会让排查变得异常困难。

因此,多版本管理的核心思想是:手动安装,手动配置环境变量,将控制权完全掌握在自己手中。

1.3 版本选择与下载建议

  • JDK 8 (Java 8): 目前仍有大量企业级应用在使用,其 LTS(长期支持)版本提供了极高的稳定性。建议选择 Oracle JDK 8uXXX 或 OpenJDK 8 的构建版本(如 Adoptium Temurin 8)。
  • JDK 17 (Java 17): 这是一个新的 LTS 版本,引入了很多现代特性(如密封类、新的垃圾收集器等),是当前新项目的主流选择。建议选择 OpenJDK 17 的构建版本,如 Adoptium Temurin 17、Amazon Corretto 17 或 Oracle OpenJDK 17。

注意:从 Oracle JDK 17 开始,对于商业用途的许可政策有所变化。对于个人学习、开发和测试,通常使用 OpenJDK 构建版(如 Temurin)是更简单无忧的选择。

2. 手动安装 JDK 8 与 JDK 17

我们将采用“手动安装 + 手动配置”的模式,确保环境干净、可控。

2.1 下载 JDK 安装包

  1. 访问 Adoptium 官网(https://adoptium.net/zh-CN/)或 Oracle 官网的 OpenJDK 页面。
  2. 分别下载 JDK 8 和 JDK 17 的 Windows x64 安装包(.msi 格式)。选择 “HotSpot” JVM 即可。
  3. 将下载好的安装包(如OpenJDK8U-jdk_x64_windows_hotspot_8uXXX.msiOpenJDK17U-jdk_x64_windows_hotspot_XXX.msi)保存到本地。

2.2 执行安装并记录路径

  1. 首先安装 JDK 8。双击运行安装程序。
  2. 在安装向导中,务必取消勾选所有关于“设置环境变量”的选项(通常描述为“Add to PATH”或“Set JAVA_HOME variable”)。
  3. 在“选择安装位置”步骤,建议使用一个清晰的路径。例如,将 JDK 8 安装到C:\Java\jdk-8记录下这个完整路径
  4. 完成 JDK 8 的安装。
  5. 接着安装 JDK 17。重复步骤 1-3,将 JDK 17 安装到另一个独立的目录,例如C:\Java\jdk-17同样记录下这个完整路径

采用C:\Java\jdk-8C:\Java\jdk-17这样的扁平化目录结构,比默认的带版本号的嵌套路径(如C:\Program Files\Java\jdk-17.0.10)更易于管理和在环境变量中引用。

安装完成后,你的C:\Java目录结构应类似于:

C:\Java\ ├── jdk-8\ │ ├── bin\ │ ├── lib\ │ ├── jre\ │ └── ... └── jdk-17\ ├── bin\ ├── lib\ ├── legal\ └── ...

3. 配置系统环境变量实现全局切换

我们的目标是:通过修改JAVA_HOME变量的值,来全局切换命令行和依赖JAVA_HOME的应用所使用的 JDK 版本。

3.1 创建 JAVA_HOME 变量

  1. 在 Windows 搜索栏输入“环境变量”,选择“编辑系统环境变量”。
  2. 在弹出的“系统属性”窗口中,点击右下角的“环境变量(N)...”按钮。
  3. 在“系统变量”区域(如果想对所有用户生效)或“用户变量”区域(如果仅对当前用户生效),点击“新建”。
  4. 变量名输入JAVA_HOME
  5. 变量值输入你当前希望作为默认版本的 JDK 路径,例如C:\Java\jdk-17。点击“确定”。

3.2 配置 PATH 变量

  1. 在“系统变量”区域,找到名为Path的变量,选中并点击“编辑”。
  2. 在打开的编辑窗口中,点击“新建”。
  3. 输入%JAVA_HOME%\bin确保这一条位于列表的最上方。如果列表中存在其他 JDK 的bin路径(尤其是旧版本自动添加的),请将它们删除或通过“上移/下移”按钮调整顺序,确保%JAVA_HOME%\bin在最前面。
  4. 点击“确定”保存所有更改。

3.3 验证全局配置

  1. 打开一个新的命令提示符(CMD)或 PowerShell 窗口。必须新开窗口,环境变量的更改不会立即应用于已打开的终端
  2. 依次执行以下命令进行验证:
# 检查 JAVA_HOME 变量是否正确指向 echo %JAVA_HOME% # 检查 Java 运行时版本,应与 JAVA_HOME 指向的版本一致 java -version # 检查 Java 编译器版本,同样应与 JAVA_HOME 指向的版本一致 javac -version

如果java -versionjavac -version的输出显示为 JDK 17,说明全局配置成功。此时,你的系统默认使用 JDK 17。

3.4 如何切换全局版本

当需要将全局默认版本从 JDK 17 切换回 JDK 8 时,你只需要做一件事:

  1. 回到“系统环境变量”设置界面。
  2. 编辑JAVA_HOME变量,将其值从C:\Java\jdk-17修改为C:\Java\jdk-8
  3. 点击“确定”保存。
  4. 重新打开一个新的命令提示符窗口,再次执行java -versionjavac -version进行验证,此时应显示 JDK 8 的信息。

注意:PATH变量中的%JAVA_HOME%\bin是动态引用的,所以只需修改JAVA_HOMEPATH就会自动生效,无需再次修改PATH

4. 使用命令行工具实现快速版本切换

频繁去系统设置里修改JAVA_HOME显然太低效。我们可以通过编写简单的批处理脚本,实现命令行的快速切换。

4.1 创建切换脚本

在任意你喜欢的位置(例如C:\Users\你的用户名\binC:\Java),创建两个批处理文件(.bat)。

创建use_jdk8.bat

@echo off setx JAVA_HOME "C:\Java\jdk-8" /M echo JAVA_HOME has been set to JDK 8. echo Please open a NEW Command Prompt for changes to take effect.

创建use_jdk17.bat

@echo off setx JAVA_HOME "C:\Java\jdk-17" /M echo JAVA_HOME has been set to JDK 17. echo Please open a NEW Command Prompt for changes to take effect.

脚本中的/M参数表示设置系统环境变量(需要管理员权限)。如果你只想设置用户变量,可以去掉/M

4.2 使用脚本并验证

  1. 以管理员身份运行命令提示符。
  2. 切换到脚本所在目录,执行use_jdk8.bat
  3. 脚本会提示已设置,并告知需要打开新的命令行窗口生效。
  4. 关闭当前所有命令行窗口,新开一个命令行(无需管理员权限),执行java -version,确认已切换至 JDK 8。
  5. 再次以管理员身份运行命令行,执行use_jdk17.bat,即可切换回去。

这种方法将切换操作简化为运行一个脚本,但缺点是每次切换后都需要新开终端。

5. 在 IDE 中配置项目级 JDK 版本

全局切换适用于整个系统,但在实际开发中,我们更常见的需求是:不同的项目使用不同的 JDK 版本,且互不干扰。主流的 IDE 都支持为每个项目或模块单独指定 JDK。

5.1 IntelliJ IDEA 配置

  1. 打开项目:在 IDEA 中打开你的 Java 项目。
  2. 打开项目结构:按Ctrl+Alt+Shift+S或点击File -> Project Structure
  3. 添加 JDK
    • Project Structure窗口左侧,选择Platform Settings -> SDKs
    • 点击左上角的+号,选择Add JDK...
    • 在弹出的文件选择器中,导航到你的 JDK 8 安装目录(如C:\Java\jdk-8),点击确定。IDEA 会自动识别并命名为 “1.8”。
    • 重复此步骤,添加 JDK 17(如C:\Java\jdk-17),IDEA 会将其命名为 “17”。
  4. 为项目指定 JDK
    • Project Structure窗口左侧,选择Project Settings -> Project
    • 在右侧的Project SDK下拉框中,选择本项目需要的 JDK 版本(例如 “17”)。
    • Project language level下拉框中,选择与 SDK 匹配的语言级别(例如选择 “17 - Sealed types, always-strict floating-point semantics”)。
  5. 为模块指定 JDK(可选):如果一个项目中有多个模块需要不同 JDK,可以在Project Settings -> Modules中,为每个模块单独设置Dependencies标签页下的Module SDK

这样配置后,无论你的系统JAVA_HOME指向哪里,IDEA 都会使用你为该项目指定的 JDK 进行编译、运行和调试。

5.2 Eclipse 配置

  1. 打开首选项Window -> Preferences
  2. 添加 JDK:导航到Java -> Installed JREs
  3. 点击Add...,选择Standard VM,点击Next
  4. 点击Directory...,选择你的 JDK 8 安装根目录(如C:\Java\jdk-8),Eclipse 会自动填充 JRE 名称,你可以将其重命名为 “JDK-8”。点击Finish
  5. 重复步骤 3-4,添加 JDK 17,命名为 “JDK-17”。
  6. 你可以勾选其中一个作为默认的 JRE。
  7. 为项目指定 JRE:在项目上右键,选择Properties。然后选择Java Build Path,在Libraries标签页下,选中JRE System Library,点击Edit...,在弹出的窗口中选择Alternate JRE,然后在下拉框中选择本项目需要的 JRE(如 “JDK-8”),点击FinishApply and Close

6. 使用构建工具管理 JDK 版本

对于 Maven 或 Gradle 项目,还可以在构建脚本中指定所需的 Java 版本,这提供了另一种维度的版本控制。

6.1 Maven 配置

在项目的pom.xml文件中,通过maven-compiler-plugin插件来指定源代码和目标字节码的版本。

<project> ... <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <!-- 或者使用统一的版本属性 --> <!-- <java.version>17</java.version> --> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <!-- 使用较新版本以更好支持新JDK --> <configuration> <!-- 如果上面用了 java.version --> <!-- <source>${java.version}</source> --> <!-- <target>${java.version}</target> --> <source>17</source> <target>17</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> ... </project>

当你在命令行执行mvn clean compile时,Maven 会使用你系统PATH中找到的javac(即当前JAVA_HOME指向的 JDK)进行编译,但它会要求编译器使用-source 17 -target 17参数。这意味着,即使你全局用的是 JDK 8,只要它版本足够高(支持编译低版本目标),也能编译针对 JDK 17 语法的代码(但可能缺少新API)。更可靠的做法是配合 IDE 的项目 SDK 设置。

6.2 Gradle 配置

在 Gradle 的构建脚本(build.gradlebuild.gradle.kts)中,可以更直接地指定工具链,Gradle 甚至会尝试自动下载所需的 JDK。

Groovy DSL (build.gradle):

plugins { id 'java' } java { toolchain { languageVersion = JavaLanguageVersion.of(17) } }

Kotlin DSL (build.gradle.kts):

plugins { java } java { toolchain { languageVersion.set(JavaLanguageVersion.of(17)) } }

配置工具链后,Gradle 会优先使用符合指定版本的 JDK 来执行所有编译、测试和运行任务。如果找不到,它会根据规则(如从 Adoptium 下载)来获取,这极大地保证了构建环境的一致性。

7. 常见问题排查与解决方案

即使按照步骤操作,你也可能会遇到一些问题。下表列出了常见问题及其解决方法:

问题现象可能原因检查与解决方案
java -versionjavac -version版本不一致PATH变量中可能存在多个 JDK 的bin目录,且javac.exejava.exe的路径顺序不同。1. 在命令行执行where javawhere javac,查看它们分别来自哪个路径。
2. 清理PATH,确保只有%JAVA_HOME%\bin一个与 JDK 相关的路径,并且顺序在最前。
修改JAVA_HOME后,新开命令行版本未变1. 环境变量未正确保存。
2. 命令行缓存。
1. 确认在“环境变量”窗口点击了所有“确定”按钮直至关闭。
2.务必关闭所有已打开的命令行窗口,重新打开一个新的。可以执行echo %JAVA_HOME%验证变量值是否已更新。
IDE 无法识别新添加的 JDK1. 路径指向错误(如指向了jre而非jdk)。
2. IDE 需要刷新。
1. 在 IDE 添加 SDK 时,确保选择的是 JDK 的根目录(包含bin,lib,jmods等文件夹的目录)。
2. 尝试重启 IDE,或使缓存失效并重启(IDEA:File -> Invalidate Caches...)。
Maven/Gradle 编译报错,提示语言级别不支持构建脚本中指定的 Java 版本高于当前用于编译的 JDK 版本。1. 检查构建脚本(pom.xml/build.gradle)中指定的版本号。
2. 在命令行执行mvn -vgradle --version,确认构建工具使用的 JDK 版本是否符合要求。
3. 将系统JAVA_HOME切换到所需版本,或使用 IDE 的终端(其环境通常由项目 SDK 控制)。
运行老项目(JDK 8)时出现UnsupportedClassVersionError项目是用更高版本的 JDK(如 17)编译的.class文件(版本号高),但试图用低版本 JRE(如 8)运行。确保运行环境的 JDK/JRE 版本 >= 编译该.class文件的 JDK 版本。检查并切换JAVA_HOME到正确的版本。

8. 最佳实践与环境维护建议

  1. 固定安装路径:将所有 JDK 安装在一个统一的父目录下(如C:\Java\),并使用无空格、无特殊字符的简短路径(如jdk-8,jdk-11,jdk-17)。这能最大程度避免因路径问题导致的配置失败。
  2. 优先使用项目级配置:养成习惯,在打开任何项目时,首先在 IDE 中确认其项目 SDK 配置是否正确。这比切换全局JAVA_HOME更安全、更隔离。
  3. 利用构建工具工具链:对于 Gradle 项目,积极使用toolchain配置;对于 Maven 项目,确保pom.xml中的编译器版本配置清晰。这能让你的构建在任意合规的机器上更具可重现性。
  4. 定期清理 PATH:定期检查系统PATH环境变量,移除那些不再使用的、陈旧的或重复的 JDK/JREbin路径,保持其简洁。
  5. 文档化环境要求:在项目的README.md或构建脚本中明确写明所需的 JDK 版本。这对于团队协作至关重要。
  6. 考虑使用版本管理工具:对于更复杂的环境管理需求,可以探索使用jenv(macOS/Linux)或第三方 Windows 版本管理工具,它们提供了更优雅的命令行切换方式。但在 Windows 上,手动管理JAVA_HOME配合脚本仍是稳定可靠的基础方法。

通过以上步骤,你不仅能在 Windows 系统上成功配置 JDK 8 和 JDK 17 的双版本环境,更能理解其背后的工作原理,掌握在全局、命令行、IDE 和构建工具等多个层面灵活切换版本的能力。这套方法也适用于配置两个以上的 JDK 版本,只需安装新版本并参照上述步骤将其添加到你的管理体系中即可。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询