多个JDK版本共存需通过路径隔离、环境变量分层控制(如JAVA_HOME_8/JAVA_HOME_17等)及工具辅助(SDKMAN!或脚本)实现;JAVA_HOME指向中间变量,PATH仅含%JAVA_HOME%\bin,再配合IDE和Maven单独配置对应版本。

多个 JDK 版本共存不是靠“装完就自动识别”,而是靠路径隔离 + 环境变量控制 + 切换机制配合实现。关键在于让系统每次只认一个版本,又能在需要时快速、干净地换另一个。
安装时就分开放,别挤在一起
每个 JDK 必须装到独立、无空格、权限可控的目录里,避免默认路径(如 C:\Program Files\Java)带来的空格和权限问题:
-
Windows:推荐
C:\java\jdk8、C:\java\jdk17、C:\java\jdk25 -
macOS:可用
/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home或自建~/jdk/jdk25 -
Linux:建议
/opt/jdk8、/opt/jdk17、/opt/jdk25
安装后确认每个目录下有 bin/java 和 lib 子目录,这是后续识别是否有效的依据。
环境变量不硬写路径,用中间层管理
不要在 PATH 里直接塞多个 jdk*/bin,也不要让 JAVA_HOME 指向具体版本。正确做法是:
立即学习“Java免费学习笔记(深入)”;
- 新建系统变量:
JAVA_HOME_8=C:\java\jdk8,JAVA_HOME_17=C:\java\jdk17,JAVA_HOME_25=C:\java\jdk25 -
JAVA_HOME本身不设值,或设为占位路径(如C:\java\placeholder) -
PATH中只加一行:%JAVA_HOME%\bin(Windows)或$JAVA_HOME/bin(macOS/Linux)
这样切换版本只需改 JAVA_HOME 的值为 %JAVA_HOME_17% 或 %JAVA_HOME_25%,再新开终端即可生效。
用轻量方式快速切换,别手动改环境变量
日常开发中频繁修改系统环境变量效率低还易出错,推荐以下方法:
-
Windows:写几个
.bat文件,比如use-jdk17.bat内容为:
@echo off<br>set JAVA_HOME=C:\java\jdk17<br>set PATH=%JAVA_HOME%\bin;%PATH%<br>java -version
-
macOS/Linux:用系统自带命令
/usr/libexec/java_home,例如:export JAVA_HOME=$(/usr/libexec/java_home -v 17) -
全平台推荐:装 SDKMAN!,一条命令搞定:
sdk install java 25.0.2-tem→sdk use java 25.0.2-tem
IDE 和构建工具要单独配,不能只信终端
终端里 java -version 显示正确,不代表 IDEA、Maven 或 Gradle 就用了这个版本:
- IntelliJ IDEA:File → Project Structure → Project → Project SDK,选对应 JDK 根目录
-
Maven:检查
pom.xml中maven-compiler-plugin的source和target,再确认MAVEN_OPTS或mvn -version输出的 Java 路径 -
VS Code:在项目根目录加
.vscode/settings.json,指定"java.configuration.runtimes"
尤其注意:老项目用 JDK 8,新项目用 JDK 25,它们的编译目标、语法支持、模块路径都不同,必须各自明确指定,不能依赖全局设置。


















