sdk list java 报 “command not found” 的主要原因是 sdkman 初始化脚本未加载:需手动执行 source "$home/.sdkman/bin/sdkman-init.sh" 或确保 ~/.zshrc(zsh)或 ~/.bashrc(bash)中包含该语句,且 ide 终端启用 shell integration。

SDKMAN 能帮你快速切换多个 Java 版本,但前提是它得正确安装、初始化,并且 shell 配置没被覆盖。很多问题不是 SDKMAN 本身坏了,而是它没被 shell 正确加载。
为什么 sdk list java 报 “command not found”
最常见原因是 SDKMAN 的初始化脚本没加载进当前 shell 环境。
- 安装后必须手动执行
source "$HOME/.sdkman/bin/sdkman-init.sh"(或新开一个终端),否则sdk命令根本不存在 - 如果用的是 Zsh(macOS Catalina+ 默认),要确认
~/.zshrc里有这行:source "$HOME/.sdkman/bin/sdkman-init.sh" - Bash 用户检查
~/.bashrc或~/.bash_profile;WSL 用户常漏掉~/.bashrc的 source - 某些 IDE 内置终端不读取 shell 配置文件,需在 IDE 设置里启用“shell integration”或改用外部终端
如何安全安装多个 JDK 并设为默认
SDKMAN 不会自动覆盖系统 Java,它通过修改 $JAVA_HOME 和 $PATH 实现软切换。
- 先运行
sdk list java查看可用版本(注意带temurin、liberica、amazoncorretto等前缀的标识,代表不同发行版) - 装指定版本:例如
sdk install java 17.0.9-temurin(版本号以sdk list java输出为准) - 设为当前 shell 有效:
sdk use java 17.0.9-temurin(退出终端即失效) - 设为全局默认:
sdk default java 17.0.9-temurin(影响所有新打开的 shell) -
sdk current java可随时查看当前生效版本
sdk default 后 java -version 还是旧版本?
大概率是 $JAVA_HOME 或 $PATH 被其他配置强行覆盖了。
立即学习“Java免费学习笔记(深入)”;
- 检查是否在
~/.zshrc或/etc/profile里硬编码了export JAVA_HOME=...—— SDKMAN 的default会被这种静态赋值顶掉 - 运行
which java和echo $JAVA_HOME,对比路径是否指向~/.sdkman/candidates/java/current - 临时修复:删掉手动写的
JAVA_HOME,只保留 SDKMAN 的 source 行,然后source ~/.zshrc - IDE(如 IntelliJ)需要重启才能读取新的环境变量,不能只 reload terminal
SDKMAN 的核心逻辑其实很轻量:它只是把不同 JDK 解压到 ~/.sdkman/candidates/java/ 下,再用符号链接控制 current 指向哪个版本。真正容易出问题的,永远是 shell 初始化顺序和环境变量的优先级冲突。










