执行 sdk install java 后未生效是因为 sdkman 不自动切换版本,需运行 sdk use 或 sdk default 手动指定;不同代号(如 tem、ms、librca)代表不同供应商,影响 jvm 行为与支持策略;ci 中需确保 sdkman-init.sh 加载、缓存更新并写死完整版本标识符。

为什么 sdk install java 装完却没生效?
执行完 sdk install java 后,java -version 还是旧版本——不是安装失败,而是没设为当前版本。SDKMAN 不会自动切换,必须显式指定。
-
sdk install java 17.0.1-tem只是把 JDK 下载解压到~/.sdkman/candidates/java/17.0.1-tem,不改环境变量 - 必须运行
sdk use java 17.0.1-tem才临时生效;要永久生效,得用sdk default java 17.0.1-tem - 如果终端是新打开的,但
sdk current java显示为空,大概率是 shell 初始化脚本没加载:检查~/.bashrc或~/.zshrc是否包含source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk list java 里一堆缩写(如 tem、ms、librca)代表什么?
这些是供应商代号,直接影响 JVM 行为和长期支持策略,不能只看版本号。
-
tem= Temurin(Eclipse 基金会维护,推荐用于生产,LTS 版本有长期安全更新) -
ms= Microsoft Build of OpenJDK(与 Azure 深度集成,Windows 上启动略快) -
librca= Liberica JDK(含 GraalVM Native Image 支持,适合做 native 编译) - 同一版本号下,不同代号的 JDK 可能默认 GC 策略、TLS 实现、甚至
File.separator行为都略有差异,CI 环境务必锁定代号
在 CI 脚本里用 sdk install 失败,提示 “No candidate available”
CI 环境(如 GitHub Actions)默认不加载交互式 shell 配置,sdk 命令可能未初始化或缓存过期。
- 先确保已执行
curl -s "https://get.sdkman.io" | bash并 source 初始化脚本(GitHub Actions 中需用source "$HOME/.sdkman/bin/sdkman-init.sh") - 加一步
sdk update,否则旧缓存可能查不到新版 JDK(尤其sdk list java返回空时) - 避免用模糊版本如
sdk install java 17,CI 中应写死完整标识符:sdk install java 17.0.1-tem - 某些 CI 镜像自带 JDK,
which java可能指向系统路径,需在sdk install后立即sdk default java 17.0.1-tem再验证
多个项目依赖不同 JDK,sdk local 真的可靠吗?
sdk local java 11.0.20-tem 会在当前目录生成 .sdkmanrc,但它的触发依赖 shell 的 cd hook,容易被忽略。
立即学习“Java免费学习笔记(深入)”;
- 仅当使用 SDKMAN 提供的
cd函数(即你没重写cd别名)时才自动生效;Zsh 用户若启用了auto_cd,cd project不触发 hook,JDK 不会切换 -
.sdkmanrc不支持通配或条件判断,子目录不会继承,每个需要独立 JDK 的模块都得单独执行sdk local - 更稳的方式是把 JDK 切换逻辑写进构建脚本开头,比如 Maven 的
mvnw包装脚本里加sdk use java 11.0.20-tem
本地开发时 sdk local 很方便,但跨团队协作或复杂目录结构下,硬编码在构建流程里反而更可控。










