sdkman! 是最省心的 jdk 版本管理工具,支持多版本安装、会话级与全局切换,并可通过 .sdkmanrc 实现项目级自动切换,避免环境混乱。

用 SDKMAN! 切换 JDK 版本最省心
SDKMAN! 是 Java 生态里最轻量、最可靠的 JDK 版本管理工具,不依赖系统环境变量手动配置,也不和 IDE 冲突。它本质是 shell 脚本集合,支持 Linux/macOS,Windows 用户需用 WSL。
安装后执行 sdk list java 可看到所有可选版本(含 Temurin、Zulu、Amazon Corretto 等),sdk install java 17.0.1-tem 安装指定版本,sdk use java 17.0.1-tem 仅对当前 shell 会话生效,sdk default java 17.0.1-tem 设为全局默认。
- IDE(如 IntelliJ)启动时读取的是系统
JAVA_HOME,所以设为default后重启 IDE 才能识别新 JDK -
sdk use不修改JAVA_HOME,只改当前 shell 的PATH前缀,适合临时编译验证 - 多个项目共存时,可在项目根目录放
.sdkmanrc文件,内容为java=11.0.20-amzn,进入目录自动切换
macOS 上用 Homebrew + jenv 混合管理也行得通
Homebrew 装 JDK 方便(brew install openjdk@17),但默认装在 /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk 这类路径,不软链到 /usr/libexec/java_home,IDE 和命令行常找不到。
这时配 jenv 就很关键:jenv add /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home 把它注册进来,再用 jenv global 17.0 或 jenv local 11.0 控制作用域。
立即学习“Java免费学习笔记(深入)”;
-
jenv version-name输出的是别名(如17.0),不是完整版本号,别拿它去比对java -version结果 - IntelliJ 的 Project SDK 设置里,要选
jenv注册后的路径(通常是~/.jenv/versions/17.0),不能直接选 Homebrew 原始路径 - 每次
brew upgrade openjdk@17后,必须重新jenv add新路径,旧软链会失效
Windows 下靠手动改 JAVA_HOME 很容易出错
PowerShell 或 CMD 中设 $env:JAVA_HOME="C:\Program Files\Java\jdk-17.0.2" 仅当前窗口有效;永久改系统环境变量虽可行,但多版本来回切时极易漏改或路径带空格没引号,导致 javac 报 Unable to locate tools.jar。
更稳的做法是:用 Scoop 安装 scoop install openjdk17 openjdk11,再配合 scoop reset openjdk17 切换“激活”状态,Scoop 会自动更新 shim 和 JAVA_HOME。
- 不要用 Chocolatey 的
jdk8、jdk11包——它们会强行覆盖注册表和全局环境变量,和其他 JDK 冲突 - VS Code 的 Java 扩展读取的是
java.home设置项,和系统JAVA_HOME无关,必须单独配 - Gradle 构建时若报
Unsupported class file major version,大概率是gradle.properties里org.gradle.java.home指向了旧 JDK,和终端当前 JDK 无关
IDEA 和 VS Code 的 SDK 配置必须独立确认
无论终端里 java -version 显示什么,IDE 都有自己的一套 JDK 绑定逻辑。IntelliJ 的 Project Structure → Project → Project SDK 和 File → Settings → Build → Gradle → Gradle JVM 是两套配置,一个管编译,一个管构建脚本执行。
VS Code 的 java.configuration.runtimes 设置必须显式列出各版本路径,格式像:
[
{
"name": "JavaSE-17",
"path": "/home/user/.sdkman/candidates/java/17.0.1-tem"
}
]
- Maven 项目右键 “Reload project” 不会自动同步 JDK 版本,得手动点 “File → Project Structure → Modules → Sources → Language level” 改
- Spring Boot 的
spring-boot-maven-plugin若设了<java>17</java>,但 Maven JVM 仍是 JDK 11,打包会静默失败(生成的 class 文件版本不匹配) - 用
mvn -v看 Maven 自身运行的 JDK,用mvn compile -X | grep 'java.version'看编译器实际用的 JDK,二者可能不同
.sdkmanrc、.java-version、gradle.properties),而不是只靠本地环境变量兜底。










