执行 sdk list java 无响应是因国内无法直连默认源 api.sdkman.io,需修改 ~/.sdkman/etc/config 中 api.host 为清华镜像地址并执行 sdk flush archives 和 sdk flush candidates 刷新缓存。

装完SDKMAN为什么 sdk list java 没反应?
常见现象是执行 sdk list java 后卡住、超时,或直接返回空列表。本质不是SDKMAN没装好,而是它默认用 https://api.sdkman.io/2/candidates/java 拉取远程索引——国内直连常被阻断或 DNS 解析失败。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 先确认网络是否能通
curl -I https://api.sdkman.io;不通就别硬等,直接切镜像源 - 编辑
~/.sdkman/etc/config,把api.host=https://api.sdkman.io改成国内可用地址,比如清华源:api.host=https://mirrors.tuna.tsinghua.edu.cn/sdkman - 改完必须执行
sdk flush archives和sdk flush candidates,否则缓存不更新,sdk list java依然为空 - 注意:部分镜像(如阿里云)只同步稳定版,
temurin-21.0.3+9这类带构建号的版本可能缺失,优先选temurin-21.0.3这种规范命名
sdk use java 切换后 java -version 不变?
根本原因是 shell 会缓存命令路径(hash -d java),且 sdk use 只影响当前 shell 会话的 $PATH 前缀,不刷新已加载的二进制路径。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 切换后立刻执行
hash -r清除命令缓存,再跑java -version - 别用
sdk use做长期设置,它只生效于当前终端;想持久化,用sdk default java <code>temurin-17.0.8+7 - 验证是否生效:不要只看
java -version,加个which java,输出应含~/.sdkman/candidates/java/temurin-17.0.8+7/bin/java - 如果用了 Oh My Zsh 或自定义
$PATH覆盖逻辑(比如在.zshrc里硬写了/usr/lib/jvm/...),SDKMAN 的$PATH插入位置会被压到后面,得检查echo $PATH里.sdkman是否排最前
Windows 上用 WSL 还是原生 PowerShell?
WSL(尤其是 WSL2)下 SDKMAN 行为最接近 Linux,但 Windows 原生 PowerShell 或 CMD 下基本不可用——因为 SDKMAN 是 Bash 脚本,依赖 source、[[、sed 等 POSIX 工具,PowerShell 无法解析。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- Windows 用户别折腾 PowerShell 版 SDKMAN,官方也明确不支持;老老实实用 WSL2(推荐 Ubuntu 22.04+)
- WSL 中安装后,记得在
~/.bashrc末尾加source "$HOME/.sdkman/bin/sdkman-init.sh",否则新终端打不开 SDKMAN - 跨工具链要注意:VS Code 的 Java 扩展默认读 Windows 的
JAVA_HOME,和 WSL 里的 SDKMAN 无关;若在 WSL 终端里开发,确保 VS Code 是以 WSL 远程模式打开的 - Mac M1/M2 用户注意:
corretto-17.0.8.7.1这类带.1后缀的是 ARM64 原生版,而corretto-17.0.8.7.1-amd64是 x86 兼容版,别下错,否则java直接报Bad CPU type in executable
多个项目共存时,怎么让每个目录自动切 JDK?
SDKMAN 本身不提供目录级自动切换,但靠 .sdkmanrc 文件 + sdk env 可以模拟实现,前提是 shell 配置了自动加载逻辑。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 在项目根目录建
.sdkmanrc,内容只写一行:java=temurin-11.0.23+12(等号右边是sdk list java里显示的精确版本名) - 确保
~/.sdkman/etc/config中auto_env=true已开启,且~/.bashrc或~/.zshrc里有sdk env调用(SDKMAN 安装脚本通常已加好) - 进入目录后,
sdk env会自动读.sdkmanrc并执行sdk use java temurin-11.0.23+12;但首次进入仍需手动触发一次sdk env,后续 cd 就自动了 - 陷阱:如果项目里同时有
.java-version(jEnv 格式)或.tool-versions(asdf 格式),SDKMAN 会无视它们——它只认自己的.sdkmanrc
sdk use java xxx。










