不能直接覆盖安装多个JDK,因会导致版本覆盖、java -version混乱及IDE/Maven读取错误;应通过SDKMAN!(Linux/macOS)或分目录+切换脚本(Windows)管理,并分别配置IDE、Maven、Gradle的JDK版本。

为什么不能直接覆盖安装多个 JDK
直接在同一个 JAVA_HOME 路径下反复安装不同版本的 JDK,会导致旧版本被覆盖、java -version 输出混乱、IDE 或构建工具(如 Maven)读取到错误的 JDK。Java 本身不提供内置的多版本切换机制,必须靠外部管理路径和环境变量。
推荐方案:用 SDKMAN! 管理多 JDK(Linux/macOS)
SDKMAN! 是轻量、命令行驱动的开发工具版本管理器,对 JDK 支持最成熟,自动处理 JAVA_HOME 和 PATH 切换,无需手动改配置文件。
- 安装后执行
sdk install java 17.0.1-tem、sdk install java 21.0.1-tem等,会把各版本装到~/.sdkman/candidates/java/下独立子目录 - 用
sdk use java 17.0.1-tem临时切换当前 shell 的 JDK;用sdk default java 21.0.1-tem设为全局默认 - 每个版本的
java、javac、keytool都能精准对应,Maven 和 Gradle 自动识别 - 避免手动设置
JAVA_HOME—— SDKMAN! 会动态注入,且不影响系统级 Java(如 Ubuntu 自带的/usr/bin/java)
Windows 下稳妥做法:手动分目录 + 切换脚本
Windows 没有类 Unix 的符号链接或成熟的版本管理器,SDKMAN! 不原生支持,建议用清晰的目录结构 + 批处理脚本控制 JAVA_HOME 和 PATH。
- 把不同 JDK 解压到固定路径,例如:
C:\dev\jdk-8u292、C:\dev\jdk-17.0.2、C:\dev\jdk-21.0.1 - 写一个
setjdk17.bat,内容为:set JAVA_HOME=C:\dev\jdk-17.0.2 set PATH=%JAVA_HOME%\bin;%PATH%
- 每次新开命令行窗口前先运行对应脚本;PowerShell 用户可用
$env:JAVA_HOME="C:\dev\jdk-21.0.1"动态设置 - 注意:不要在系统环境变量里硬编码
JAVA_HOME,否则 IDE(如 IntelliJ)可能缓存旧值,需重启生效
IDE 和构建工具怎么认准 JDK 版本
IDE 和构建工具通常不完全依赖系统 JAVA_HOME,它们有自己的 JDK 配置入口,容易忽略导致“命令行是 JDK 21,IDE 编译报 JDK 8 错误”。
立即学习“Java免费学习笔记(深入)”;
- IntelliJ IDEA:File → Project Structure → Project Settings → Project → SDK;同时检查 Modules → Language level
- Eclipse:Preferences → Java → Installed JREs,勾选目标 JDK,并在项目 Properties → Java Build Path → Libraries 中确认使用的是该 JRE
- Maven:检查
pom.xml中的maven-compiler-plugin是否显式指定和,否则默认用当前JAVA_HOME对应的 JDK 编译 - Gradle:在
build.gradle中设置java.toolchain.version = "17",它会主动查找匹配的本地 JDK,不依赖环境变量
java -version 是三套独立逻辑,得分别对齐。










