Windows 下多版本 JDK 配置教程:一键切换环境,告别路径冲突

Windows 下多版本 JDK 配置教程:一键切换环境,告别路径冲突

 

在日常 Java 开发中,我们常常会遇到「不同项目依赖不同 JDK 版本」的场景 —— 比如老项目需要 JDK 8 兼容,新业务又要用到 JDK 25 的新特性。直接修改环境变量不仅繁琐,还容易出现版本冲突、命令找不到的问题。这篇教程会手把手教你在 Windows 系统中配置多个 JDK 版本,核心目标是:

  1. 让系统能正常识别并调用 JDK 25 的java/javac命令;
  2. 无需反复修改环境变量界面,一键切换 JDK 8 和 JDK 25;
  3. 从根源避免多版本 JDK 的路径冲突问题

 

一、下载并安装多版本 JDK

1.首先前往 Oracle 官网下载需要的 JDK 版本

目前开发中常用的版本有:

  • JDK 8(也常写作 jdk1.8,经典长期支持版本,兼容大部分老项目);
  • JDK 11、JDK 17、JDK 21/25(新一代长期支持版本,适配新特性开发)。

小建议:优先选择「自动安装版」(.exe 格式),比解压版更省心,无需手动配置解压路径。

2.下载后安装到独属的固定位置文件夹,这里安装到C:\jdk文件夹

一个文件夹是C:\jdk\jdk8

一个文件夹是C:\jdk\jdk21

3.先安装 jdk 8,再安装jdk 21

安装时修改上述自定义路径

 

4.配置系统环境变量

步骤 1:新增 JDK 版本专属变量(方便切换):

  • 新建变量:JAVA_8_HOME,值填 JDK 8 的安装路径(比如C:\jdk\jdk8 );
  • 新建变量:JAVA_21_HOME,值填 JDK 21 的安装路径(比如 C:\jdk\jdk21);

步骤 2:修改 / 新建 JAVA_HOME(核心切换变量):

  • 若没有 JAVA_HOME,新建

若已有 JAVA_HOME,修改它的值为%JAVA_25_HOME%  或者%JAVA_8_HOME%都可

步骤 3:确保 PATH 里的 Java 路径是 “动态的”

  • 找到系统变量中的 PATH 变量,编辑,确保里面有 %JAVA_HOME%\bin(优先级高,但最好不要放到前三个之前),删掉原来直接写死的 JDK 8 路径(比如 C:\ProgramFiles\Java\jdk1.8.0_xxx\bin`);

注意!!配置完成后环境变量的三个界面都要点击确定

 

5.验证配置是否成功

打开新的命令提示符(cmd),输入命令验证:

 # 查看当前使用的 JDK 版本  java -version  # 查看编译器版本(javac 只在 JDK 里有,JRE 没有)  javac -version

  • 若显示 java version "25.x.x",说明 JDK 25 配置成功;
  • 若显示 java version "1.8.0_xxx",说明当前用的是 JDK 8 

6.快速切换 JDK 版本(不用改环境变量界面)

步骤 1:显示文件扩展名

打开「此电脑」→ 点击顶部「查看」选项卡;勾选「文件扩展名」

步骤 2:创建「切换到 JDK 8.bat」

  • 在桌面空白处右键 →「新建」→「文本文档」;
  • 重命名该文件为 切换到 JDK8.bat注意:后缀是.bat,不是.txt,改名时会提示 “更改扩展名可能导致文件不可用”,点击「是」);
  • 双击打开这个 .bat 文件(用记事本打开),复制粘贴以下内容: @echo off  :: 关闭命令回显,让输出更干净  :: 永久修改系统级 JAVA_HOME 为 JDK 8  setx JAVA_HOME "%JAVA_8_HOME%" /m  :: 提示用户切换结果  echo ======================================  echo 已将系统 JAVA_HOME 切换为 JDK 8!  echo 注意:需关闭所有已打开的 CMD/IDE,重新打开才生效!  echo ======================================  :: 暂停窗口,让用户看到提示  pause  ​
  • 点击记事本「文件」→「另存为」(编码选「ANSI」,避免中文乱码)替换原文本。

步骤 3:创建「切换到 JDK 21.bat」

  • 重复步骤 2 的 1-2:在桌面新建文本文档,重命名为 切换到 JDK 25.bat(后缀.bat);
  • 双击打开,复制粘贴以下内容: @echo off  :: 永久修改系统级 JAVA_HOME 为 JDK 25  setx JAVA_HOME "%JAVA_25_HOME%" /m  :: 提示用户切换结果  echo ======================================  echo 已将系统 JAVA_HOME 切换为 JDK 25!  echo 注意:需关闭所有已打开的 CMD/IDE,重新打开才生效!  echo ======================================  :: 暂停窗口,让用户看到提示  pause
  • 点击记事本「文件」→「另存为」(编码选「ANSI」,避免中文乱码)覆盖原文本。 

7.以管理员身份运行脚本

脚本内代码setx /m 是修改系统级环境变量,需要管理员权限,否则会报错:

  • 右键点击桌面的「切换到 JDK 25.bat」→「以管理员身份运行」;
  • 按任意键关闭窗口即可。

会弹出命令行窗口,显示:

8.验证切换结果

  • !关闭所有已打开的 CMD / 终端 / IDE*(旧窗口会缓存环境变量,修改不生效);
  • 重新打开一个新的 CMD(普通身份即可,不用管理员);
    • 原因:JAVA_8_HOME/JAVA_25_HOME 配置错误,或路径里有空格 / 中文;
    • 解决:
      1. 重新检查环境变量里的 JAVA_8_HOME/JAVA_25_HOME,确保路径是 JDK 根目录(比如 C:\Program Files\Java\jdk-25,不是 C:\Program Files\Java\jdk-25\bin);
      2. 若路径有空格(比如 Program Files),可以给路径加引号,比如把脚本里的 %JAVA_8_HOME% 改成 "C:\Program Files\Java\jdk1.8.0_202"
    • 原因:没有以管理员身份运行脚本;
    • 解决:右键脚本 →「以管理员身份运行」。
    • 原因:没关闭旧 CMD/IDE,或 PATH%JAVA_HOME%\bin 优先级不够;
    • 解决:
      1. 关闭所有 CMD/IDE,重新打开;
      2. 检查 PATH 变量,把 %JAVA_HOME%\bin 拖到最顶部。
    • 原因:记事本保存时编码不是 ANSI;
    • 解决:打开脚本 →「文件」→「另存为」→ 编码选「ANSI」→ 保存。

输入以下命令验证: # 查看 Java 运行时版本  java -version  # 查看 Java 编译器版本(JDK 特有,验证是否是完整 JDK)  javac -version

常见问题 & 解决方法

问题 1:运行脚本提示「找不到指定的路径」问题 2:运行脚本提示「拒绝访问」问题 3:验证时还是旧版本问题 4:脚本里的中文乱码

 

 

 

Read more

微服务项目->在线oj系统(Java-Spring)----6.0

微服务项目->在线oj系统(Java-Spring)----6.0

创建token 在oj-common-security中引入依赖 创建jwt⼯具类: package com.bite.common.security.utils; import com.bite.common.core.comtains.JwtContains; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.HashMap; import java.util.Map; public class JwtUtils { /** * 生成令牌 * * @param claims 数据 * @param secret 密钥 * @return 令牌 */ public

By Ne0inhk
飞算JavaAI炫技赛:在线图书借阅平台的设计与实现

飞算JavaAI炫技赛:在线图书借阅平台的设计与实现

大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注实战代码系列最新文章😉C++实现图书管理系统(Qt C++ GUI界面版)SpringBoot实战系列🐷【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案分库分表分库分表之实战-sharding-JDBC分库分表执行流程原理剖析消息队列深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK) 本文章目录 * 飞算JavaAI炫技赛:在线图书借阅平台的设计与实现 * 一、需求分析与规划 * 一、功能需求 * 1. 用户端功能 * 2. 管理员端功能 * (二)核心模块 * (三)技术选型 * 二、飞算JavaAI开发实录 * (一)飞算JavaAI需求理解阶段 * (二)接口设计阶段 * (三)表结构设计阶段 * (四)逻辑处理(接口)阶段 * (五)源码生成阶段 * 三、优化与调试心得 * (一)

By Ne0inhk
Java IO 流进阶:Buffer 与 Channel 核心概念解析及与传统 IO 的本质区别

Java IO 流进阶:Buffer 与 Channel 核心概念解析及与传统 IO 的本质区别

在 Java IO 编程中,传统的字节流与字符流大家都不陌生,但当面对高并发、大文件处理等场景时,NIO(New IO)中的 Buffer 与 Channel 逐渐成为性能优化的关键。本文将深入剖析 Buffer 与 Channel 的核心概念,通过对比传统 IO 流,带你理解它们为何能显著提升 IO 效率,并配合直观的图示帮你建立清晰的认知。 一、传统 IO 流的局限性:为什么需要 Buffer/Channel?         在了解 Buffer 与 Channel 之前,我们先回顾传统 IO 流的工作方式。传统 IO 流分为字节流(InputStream/OutputStream) 和字符流(Reader/Writer)

By Ne0inhk
Java 手写 AI Agent:ZenoAgent 实战笔记

Java 手写 AI Agent:ZenoAgent 实战笔记

摘要:作为一个长期使用 Java 的后端开发者,我对 AI Agent 的内部运作机制充满了好奇。为了深入理解 Agent 的工作原理,我决定动手写一个简单的 Agent 系统 —— ZenoAgent。本文记录了我在这个过程中的学习心得与技术实践,包括如何手写 ReAct 循环、在分布式环境下实现 Human-in-the-loop、尝试复刻类 o1 的流式思考以及探索错误处理机制。希望这些踩坑经验能给同样想探索 AI 的 Java 开发者一些参考。 👀 在线体验:项目已部署上线,欢迎试玩:线上部署地址 (注:受限于服务器资源,线上本地部署了 Qwen3:8B 模型(参见另一篇博文华为云服务器本地部署大模型实战),虽不如商业模型聪明,但足以演示 Agent 的核心能力) 💡 写在前面:我的学习初衷 市面上已经有了像 LangChain 和 AutoGen

By Ne0inhk