OpenJDK 多版本可共存,关键在于路径规范(无空格/中文)、JAVA_HOME 动态指向(如%JAVA_HOME_17%)、Path仅含%JAVA_HOME%\bin、删除javapath干扰项,并用脚本切换。

解压到无空格无中文的独立目录
这是最基础也最容易翻车的一步。Windows 下常见错误是把 JDK 解压到 C:\Program Files\Java\jdk-17 这类带空格或特殊字符的路径——setx、批处理、Maven、Gradle 都可能因空格解析失败而报 'java' is not recognized 或 Unable to find java version。
- 推荐路径:
D:\Java\jdk-8u412、D:\Java\jdk-17.0.10、D:\Java\jdk-21.0.3 - 避免路径:
C:\Program Files\...、D:\我的JDK\...、D:\Java\jdk 17\... - 解压后确认
bin\java.exe和bin\javac.exe存在,且能双击运行(非必须,但可快速验证完整性)
JAVA_HOME 不要直接写死路径
系统级环境变量里,JAVA_HOME 必须指向当前“生效”的 JDK,但它不该是固定字符串。否则每次切换都要手动改,IDE 和终端还不同步。
- 正确做法:定义辅助变量,如
JAVA_HOME_8、JAVA_HOME_17、JAVA_HOME_21,值分别为各版本实际路径 - 再让
JAVA_HOME指向其中之一,例如:%JAVA_HOME_17% -
Path中只加一行:%JAVA_HOME%\bin—— 这样改JAVA_HOME就自动切换所有命令 - 注意:
setx不支持嵌套变量展开(setx JAVA_HOME "%JAVA_HOME_17%"在新会话中会存成字面量),应使用set(临时)或注册表/图形界面修改(永久)
用批处理脚本一键切换(Windows)
手动点进系统设置改变量太慢,尤其当你频繁在 Spring Boot 2(需 JDK 8)和 Spring Boot 3(需 JDK 17)项目间跳转时。
- 新建
java8.bat:@echo off setx JAVA_HOME "D:\Java\jdk-8u412" /M setx PATH "D:\Java\jdk-8u412\bin;%PATH%" /M echo JDK 8 activated
- 同理建
java17.bat,把路径换成D:\Java\jdk-17.0.10 - 每次双击运行对应脚本,然后**重启命令行或 PowerShell**(环境变量不会热更新)
- 进阶:用
PowerShell写更健壮的脚本,检查路径是否存在、是否含bin\java.exe,避免切错后命令失效
别碰系统自带的 javapath(Windows)
某些 JDK 安装程序(尤其是 Oracle 的 .exe 包)会偷偷往 Path 里塞一条:C:\Program Files (x86)\Common Files\Oracle\Java\javapath。这个目录下是几个指向真实 java.exe 的快捷方式,但它绕过了 JAVA_HOME,导致你改了变量却切不动版本。
- 务必在「系统环境变量 → Path」里删掉这一条(以及任何类似
javapath的条目) - 删完后打开新终端,执行
where java—— 输出应该只有你%JAVA_HOME%\bin下的那个路径 - 如果仍有多个结果,说明还有别的 JDK 路径被硬编码进了
Path,一并清理
JAVA_HOME,自己去猜 Java 路径。这种隐式依赖,比环境变量配置本身更难排查。


















