macOS 12+默认不预装JDK,需用SDKMAN!安装OpenJDK(如temurin-17.0.9+9)并配置~/.zshrc;IDE和Gradle/Maven须显式指定JAVA_HOME为~/.sdkman/candidates/java/current。

确认系统自带的 Java 是否可用
macOS 12(Monterey)及之后版本默认不再预装 JDK,但部分旧版本可能残留 /usr/bin/java 指向一个仅含 JRE 的 Apple 提供版本。运行 java -version 和 javac -version 很可能报错:command not found: javac 或提示 “No Java runtime present”。这说明你缺的是 JDK,不是 JRE。
不要依赖 brew install java(它只装 JRE),也不要手动下载 Oracle JDK 后双击安装——macOS 会把它放进 /Library/Java/JavaVirtualMachines/,但环境变量不会自动配置。
- 检查已安装 JDK 列表:
/usr/libexec/java_home -V - 若输出为空,说明没有可识别的 JDK;若有输出但无
javac,说明装的是 JRE - 推荐用 SDKMAN! 或 Homebrew 安装 OpenJDK,避免权限和路径混乱
用 SDKMAN! 安装并切换 JDK 版本
SDKMAN! 是最稳妥的 Java 多版本管理工具,尤其适合需要在不同项目间切换 JDK(如 Java 8 / 17 / 21)的场景。它不依赖系统级安装,所有 JDK 都放在用户目录下,export 路径干净可控。
执行以下命令:
立即学习“Java免费学习笔记(深入)”;
curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" sdk list java
选一个 LTS 版本安装(例如 temurin-17.0.9+9):
sdk install java 17.0.9-temurin sdk use java 17.0.9-temurin
-
sdk use只对当前 shell 有效;要永久生效,把source "$HOME/.sdkman/bin/sdkman-init.sh"加入~/.zshrc(macOS Catalina 及以后默认用 zsh) - 验证:
java -version和javac -version输出应一致,且包含 “Temurin” 或 “Eclipse Adoptium” 字样 - 避免混用:卸载掉
/Library/Java/JavaVirtualMachines/下非 SDKMAN! 管理的 JDK,防止java_home返回多个路径导致 IDE 识别错乱
IntelliJ IDEA 或 VS Code 中正确识别 JDK
IDE 不读取 shell 的 PATH,而是依赖 java.home 设置或自动扫描 $JAVA_HOME。如果新建项目仍提示 “Cannot resolve symbol java.lang.Object”,大概率是没配对 JDK 路径。
- IntelliJ:Preferences → Project → Project SDK → Add JDK → 选择
~/.sdkman/candidates/java/current(或展开路径选具体版本) - VS Code + Extension Pack for Java:在设置中搜
java.home,设为~/.sdkman/candidates/java/current - 别用
/usr/libexec/java_home -v 17输出的路径——它可能指向系统级安装位置,而 SDKMAN! 的 JDK 在用户目录,路径更稳定 - 重启 IDE;打开终端运行
which java,确认指向~/.sdkman/candidates/java/current/bin/java
Gradle/Maven 构建时 JDK 不一致的问题
即使终端里 java -version 正确,Gradle 可能仍用错 JDK——因为 Gradle 默认读 org.gradle.java.home 或 $JAVA_HOME,而非当前 shell 的 java 命令。
- 检查:
gradle -version输出中的 “JVM” 行是否与你期望的 JDK 一致 - 临时指定:
org.gradle.java.home=$HOME/.sdkman/candidates/java/current ./gradlew build - 永久设置:在
~/.gradle/gradle.properties中加一行:org.gradle.java.home=/Users/yourname/.sdkman/candidates/java/current - Maven 类似:确保
mvn -v显示的 Java home 与 SDKMAN! 路径一致;否则在~/.mavenrc中写export JAVA_HOME=$HOME/.sdkman/candidates/java/current
最容易被忽略的是:IDE 内嵌终端(如 IntelliJ Terminal)默认不加载 ~/.zshrc,所以即使你配了 SDKMAN!,新开的 IDE 终端里 java 命令可能还是找不到——需要在 IDE 设置里勾选 “Shell integration” 或手动 source。










