gradle命令行启动时使用java_home指定的jdk;若未设置,则回退至path中首个java;ide中运行则依赖其独立配置的gradle jvm,不继承shell的java_home。

Gradle命令行启动时用哪个JDK?看JAVA_HOME是否生效
终端里执行gradle命令时,Gradle进程本身运行在哪个JDK上,**完全取决于当前shell环境中的JAVA_HOME变量**。它不读gradle-wrapper.properties,也不管IDE里怎么配。
常见错误现象:gradle -v显示JDK 17,但项目里用了Thread.ofVirtual()却报UnsupportedOperationException——说明Gradle脚本实际运行在旧JDK上。
- 新开终端后先验证:
echo $JAVA_HOME必须输出ARM64版JDK 21路径(如/Users/xxx/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home) - 执行
java -version和$JAVA_HOME/bin/java -version输出必须一致,且含ARM64或Temurin字样 - 如果
JAVA_HOME未设置,Gradle会 fallback 到PATH里第一个java,极易错配(比如系统自带的JDK 17)
IDE里运行Gradle任务,JAVA_HOME可能被绕过
IntelliJ或VS Code启动Gradle时,**默认不继承shell的JAVA_HOME**,尤其当你从Dock或Spotlight启动IDE时——它启动的是login shell之外的进程,~/.zprofile根本没加载。
所以即使终端里gradle -v正确,IDE里编译仍失败,大概率是这个原因。
- IntelliJ:进
Settings > Build, Execution, Deployment > Build Tools > Gradle,把Gradle JVM下拉框手动选成你装的JDK 21(路径要和$JAVA_HOME一致) - VS Code:打开命令面板(
Cmd+Shift+P),搜Java: Configure Java Runtime,在Gradle Runtime里指定同一JDK - 别信“自动检测”——它常选错;也别依赖IDE的
Project SDK设置,那只是编译源码用的,和Gradle运行时无关
gradle-wrapper.properties只影响下载的Gradle版本,不控制JDK
很多人以为改了distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip就能让项目用JDK 21,这是误解。这个URL只决定用哪个Gradle二进制包,**Gradle自身运行时的JDK仍是JAVA_HOME或IDE显式配置的那个**。
真正关键的是:Gradle 8.10+才支持JDK 21虚拟线程等新特性。若你用gradle-8.3-bin.zip,哪怕JAVA_HOME指向JDK 21,Thread.ofVirtual()仍会触发NoSuchMethodError。
- 检查方式:
gradle -v输出第一行必须是Welcome to Gradle 8.10或更高 - 如果wrapper里是低版本,直接改
distributionUrl并删掉~/.gradle/wrapper/dists/下对应旧缓存目录,再运行./gradlew -v强制重拉 - 不要手动替换
gradle/wrapper/gradle-wrapper.jar——校验机制会拒绝非法包
多JDK共存时,/usr/libexec/java_home -v 21比硬编码路径可靠
写死export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home看似简单,但在M1 Mac上极易失效:Temurin、Zulu、Oracle JDK都可能装在不同路径,且升级后路径名带版本号变(如jdk-21.0.1.jdk)。
Apple官方工具/usr/libexec/java_home能动态查到当前系统里所有合法JDK,并按架构、版本精准匹配。
- 务必用
export JAVA_HOME=$(/usr/libexec/java_home -v 21),不是-V(那是大写,只列出) - 加到
~/.zprofile而非~/.zshrc——前者是login shell必读,后者只在交互式非login shell中加载,IDE启动时往往不读 - 验证是否生效:
ls $JAVA_HOME应能列出bin/、lib/等目录,且$JAVA_HOME/bin/java -version不报错
JAVA_HOME,IDE里靠显式下拉框选。两者不一致,就是90%构建问题的根源。最易忽略的是IDE启动方式绕过shell配置——别假设“我在终端里配好了,IDE就一定对”。











