sdkman需在bash/zsh中正确初始化才能管理jdk:安装后必须source sdkman-init.sh并写入对应shell配置文件,否则java仍指向系统默认;sdk install仅下载,sdk use临时切换,sdk default才持久生效;path冲突或current链接悬空会导致java/javac不更新。

SDKMAN 能可靠地管理多个 JDK 版本,但前提是它必须运行在支持的 shell 环境中(如 Bash、Zsh),且初始化脚本被正确加载;否则 java 命令仍会指向系统默认 JDK,sdk list java 可能报错或返回空。
安装后必须手动初始化 shell 配置
SDKMAN 不是“装完即用”,它依赖 shell 的 source 加载自身环境变量。常见失败原因是跳过了这步,或配置未写入当前 shell 的启动文件。
- 执行
curl -s "https://get.sdkman.io" | bash后,必须运行source "$HOME/.sdkman/bin/sdkman-init.sh" - Zsh 用户需将
source "$HOME/.sdkman/bin/sdkman-init.sh"追加到~/.zshrc;Bash 用户对应~/.bashrc - 新开终端后运行
sdk version验证是否生效;若提示 command not found,说明初始化失败
sdk install java 与 sdk use java 的关键区别
sdk install 只下载并解压指定版本到 ~/.sdkman/candidates/java/,不改变当前环境;sdk use 是临时切换,仅对当前 shell 有效;而 sdk default 才会持久化影响所有新终端。
- 列出可用版本:
sdk list java(注意部分发行版如temurin、liberica需看全名,如temurin-17.0.2+8) - 安装指定版本:
sdk install java 17.0.2-temurin(版本标识符必须完全匹配sdk list输出) - 临时使用:
sdk use java 17.0.2-temurin→ 此时java -version生效,但关掉终端即失效 - 设为默认:
sdk default java 17.0.2-temurin→ 新开终端自动启用该版本
切换 JDK 后 javac 或 java 仍不更新?检查 PATH 冲突
即使 sdk default 成功,若系统 PATH 中存在硬编码的 JDK 路径(如 /usr/lib/jvm/java-11-openjdk-amd64/bin),它会优先于 SDKMAN 的 ~/.sdkman/candidates/java/current/bin。
立即学习“Java免费学习笔记(深入)”;
- 运行
which java和echo $PATH,确认输出路径以~/.sdkman/candidates/java/current/bin开头 - 检查
/etc/environment、/etc/profile、用户主目录下的.profile是否有export JAVA_HOME=...或export PATH=...硬编码 - SDKMAN 自动设置
JAVA_HOME,因此外部显式设置会覆盖它;应删除或注释掉这些行
最容易被忽略的是:SDKMAN 的 current 符号链接是否真实指向已安装版本目录——有时 sdk install 失败但无明确报错,current 悬空,导致 java 命令根本找不到可执行文件。










