是,sdkman核心功能就是并行管理多个java版本,各版本独立存放于~/.sdkman/candidates/java下,通过current软链接切换,支持sdk use(会话级)和sdk default(全局默认)两种切换方式。

SDKMAN能同时装好几个Java版本吗
能,而且这是它最核心的用途。SDKMAN不是只装一个Java再覆盖另一个,而是把每个版本独立存放在~/.sdkman/candidates/java下,用软链接current指向当前激活的版本。你装temurin-17.0.2+8、zulu-11.0.22、liberica-21.0.1,它们全共存,互不干扰。
常见错误现象:java -version没变,或者提示command not found: java——大概率是没执行sdk default java xxx或sdk use java xxx,也可能是Shell配置没生效(比如Zsh用户忘了在~/.zshrc里加SDKMAN初始化代码)。
- 装新版本用
sdk install java [版本号],不会动已有版本 -
sdk list java看到带*的是当前默认版本,带+的是当前shell会话中激活的版本 - 不同Shell(Bash/Zsh/Fish)要各自配置
source "$HOME/.sdkman/bin/sdkman-init.sh",否则sdk命令压根不可用
切换Java版本时,为什么IDE还是用旧版本
因为IDE(IntelliJ、VS Code、Eclipse)通常不读SDKMAN的current软链接,它们要么自己缓存了JDK路径,要么依赖系统环境变量(JAVA_HOME),而SDKMAN默认不自动设JAVA_HOME——除非你显式运行sdk default java xxx,它才会写进~/.sdkman/etc/config并影响新打开的终端。
使用场景:你在终端里sdk use java temurin-17.0.2+8切好了,java -version显示正确,但IntelliJ里Maven编译报错说用了Java 11,这就是典型环境隔离问题。
- IntelliJ:必须手动在
Project Structure → Project → Project SDK里选对应版本,不能依赖终端切换 - VS Code + Java Extension:检查
java.home设置是否指向~/.sdkman/candidates/java/temurin-17.0.2+8这类具体路径,而非~/.sdkman/candidates/java/current - 命令行工具(如Maven、Gradle)一般没问题,只要它们没硬编码
JAVA_HOME,就随终端走
SDKMAN的sdk use和sdk default到底差在哪
差在作用域。sdk use java xxx只影响当前终端会话,关掉窗口就失效;sdk default java xxx会改SDKMAN的全局默认值,所有新开终端都继承它——但它**不改变已打开终端的当前状态**。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
参数差异:两者都接受完整版本标识符(如temurin-17.0.2+8),不支持模糊匹配(sdk use java 17会失败)。想查可用缩写,得先sdk list java看括号里的别名(比如17.0.2-amzn)。
-
sdk use适合临时测试:跑个老项目用Java 8,测完就切回来,不用动默认设置 -
sdk default适合主力开发环境设定,但别指望它“立刻同步”到所有已开终端 - 如果某次
sdk use后发现java命令仍指向旧版本,先which java确认是不是PATH里有别的Java(比如系统自带的/usr/bin/java)抢在前面
卸载Java版本后,相关项目还能正常构建吗
不能,会直接报Could not find tools.jar或Unable to locate a JVM这类错误。SDKMAN删的是整个目录(如~/.sdkman/candidates/java/zulu-8.72.0.23),路径彻底消失,任何硬编码该路径的配置都会断。
性能 / 兼容性影响:卸载本身很快,但要注意Maven本地仓库(~/.m2/repository)或Gradle缓存(~/.gradle/caches)里可能有按Java版本生成的class文件,换版本后首次构建会重新编译,略慢;但不会损坏缓存。
- 删前先
sdk list java确认没项目正依赖它,尤其是CI脚本里写的固定版本号 - 卸载命令是
sdk uninstall java [版本号],不是remove或delete - 误删了?重装同版本即可,SDKMAN不记录项目级依赖关系,它不管你的pom.xml写了什么
最容易被忽略的一点:SDKMAN管理的是java命令和JAVA_HOME,但像javac、jar这些配套工具,全靠$JAVA_HOME/bin在PATH里顶上——所以PATH顺序出问题,javac -version和java -version就可能不一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










