sdkman执行sdk list java无响应是因默认源https://api.sdkman.io/2被国内网络阻断,应换为镜像源https://mirror.sdkman.io/2并确保未手动设置java_home覆盖sdkman管理。

SDKMAN 装完为啥 sdk list java 没反应?
常见现象是执行 sdk list java 后卡住、超时,或直接返回空列表。这不是 SDKMAN 坏了,而是它默认从 https://api.sdkman.io/2/candidates/java 拉取数据,国内网络常被阻断或延迟极高。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 临时换源:运行
export SDKMAN_CANDIDATES_API=https://mirror.sdkman.io/2(仅当前终端有效) - 永久生效:把这行加到
~/.bashrc或~/.zshrc末尾,再source一下 - 确认代理没干扰:如果用了全局代理,试试关掉;SDKMAN 不走系统 proxy 环境变量,某些代理会静默失败
- 别用
curl测试连通性:SDKMAN 内部用的是 Java HTTP 客户端,和命令行 curl 行为不一致,真要测就跑sdk version看是否能拿到版本号
安装 JDK 17 和 JDK 21 后,java -version 还是旧版本?
SDKMAN 不会自动改系统级 JAVA_HOME 或 PATH,它只管理自己目录下的版本,并通过 shell 函数劫持 java 命令。一旦你手动改过 JAVA_HOME,或者在 .bash_profile 里硬写了 export JAVA_HOME=...,SDKMAN 的切换就会被覆盖。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 检查是否重复导出:
grep -n "JAVA_HOME" ~/.bashrc ~/.zshrc ~/.profile 2>/dev/null - 删掉所有显式
export JAVA_HOME=...行——SDKMAN 的sdk use java x.y.z-xxx会动态设好它 - 确保 SDKMAN 初始化代码在 shell 配置文件里靠前位置,且没有被后续的
PATH=...覆盖 - 验证当前生效版本:
sdk current java(看 SDKMAN 认为谁在用),再which java(看实际调用路径)
sdk install java 装出来的版本名太长,怎么选最简版?
SDKMAN 列出的 Java 版本名像 21.0.3-tem、17.0.12-zulu、17.0.11-amzn,后缀代表厂商和构建类型。不是所有都适合日常开发——比如 liberica 在某些 M1/M2 Mac 上有 JIT 编译问题,amzn 默认不带 JFX,ms(Microsoft Build of OpenJDK)偶尔同步滞后。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 优先选
tem(Temurin):Eclipse 基金会维护,稳定、更新快、全平台支持好 - Mac 用户避开
zulu的早期 21.x 版本(如21.0.1-zulu),有 class-data-sharing 兼容问题 - 别贪新:JDK 22+ 的
sem(Semeru)目前只推预览版,生产环境慎用 - 装的时候写全名:
sdk install java 21.0.3-tem,不输后缀会默认装第一个(可能不是你要的)
IDE(IntelliJ / VS Code)不认 SDKMAN 切换的 JDK?
IDE 启动时读取的是它自己的 JVM 配置或项目配置,和当前 shell 的 java 命令无关。即使你在终端里 sdk use java 17.0.3-tem,IDE 可能仍用老版本编译、运行、甚至启动自身。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- IntelliJ:进
Project Structure → Project → Project SDK,点小齿轮 →Add JDK…→ 选~/sdkman/candidates/java/17.0.3-tem目录 - VS Code + Extension Pack for Java:在设置里搜
java.home,填绝对路径,例如/home/you/.sdkman/candidates/java/21.0.3-tem - 别依赖
java命令:有些插件(如 Maven for VS Code)会去查java -version,但 IDE 自身 JVM 是独立进程,必须单独配 - 重启 IDE:改完配置后必须完全退出再重开,热重载不生效
SDKMAN 本身不接管 IDE,也不修改全局环境——它的“切换”只发生在你当前 shell 会话里。这点最容易被忽略,尤其当脚本、CI 或 IDE 跨会话调用时,以为切了就全局生效。










