SDKMAN可切换JDK版本但不设JAVA_HOME,需手动source初始化脚本;sdk use仅临时改PATH,IDE/构建工具须显式配置真实JDK路径而非current软链。

SDKMAN 能可靠地在 Java 开发中切换 JDK 版本,但必须注意它只管理 java、javac 等二进制命令的软链接,不修改系统级 JAVA_HOME 环境变量——这是多数人执行 java -version 正确但 IDE 或构建工具仍报错的根本原因。
安装 SDKMAN 后必须重载 shell 配置
执行 curl -s "https://get.sdkman.io" | bash 后,SDKMAN 的初始化脚本并未自动生效。需要手动加载或新开终端:
source "$HOME/.sdkman/bin/sdkman-init.sh"
否则所有 sdk list java、sdk install java 17.0.1-tem 命令都会提示 command not found: sdk。Mac 用户若用 zsh,还需确认 ~/.zshrc 是否已追加该 source 行;Linux Bash 用户检查 ~/.bashrc。
sdk install 和 sdk use 的作用范围是当前 shell
sdk install 只下载并解压 JDK 到 ~/.sdkman/candidates/java/ 下对应子目录;sdk use java 17.0.1-tem 才会临时将 ~/.sdkman/candidates/java/current 指向该版本,并更新当前 shell 的 PATH。这意味着:
立即学习“Java免费学习笔记(深入)”;
- 新开终端后,JDK 回退到
sdk default java设置的版本(若未设,默认为首次安装的版本) - GUI 应用(如 IntelliJ IDEA)启动时不会读取你当前 shell 的
PATH,所以即使终端里java -version显示 21,IDE 内部仍可能用错 JDK -
sdk use不改变JAVA_HOME,需手动导出:export JAVA_HOME="$HOME/.sdkman/candidates/java/current"
IntelliJ / Maven / Gradle 无法识别 SDKMAN 切换的 JDK
根本问题在于这些工具依赖 JAVA_HOME 或显式配置路径,而非仅靠 PATH。解决方案分场景:
- IntelliJ:不要依赖 “Use project JDK from PATH”,而是在
Project Structure → Project → Project SDK中点击+ → Add JDK,定位到~/.sdkman/candidates/java/17.0.1-tem(不是current) - Maven:在
~/.mavenrc中写入export JAVA_HOME="$HOME/.sdkman/candidates/java/17.0.1-tem"
,避免每次sdk use后失效 - Gradle:在
gradle.properties中设org.gradle.java.home=/home/you/.sdkman/candidates/java/21.0.1-tem,路径必须绝对且指向具体版本目录
最易被忽略的是:SDKMAN 的 current 是符号链接,某些旧版 IDE 或 CI 工具会拒绝跟随软链,必须用真实路径。另外,Docker 构建或 CI 流水线中直接用 sdk use 无效,应改用 export JAVA_HOME + export PATH 组合硬编码路径。










