IDE启动不依赖系统JAVA_HOME,而是优先使用显式配置的project SDK或java.home;Maven/Gradle构建、终端环境及多模块子模块SDK需单独配置,四层设置易导致JDK版本混乱。
绝大多数 Java IDE(IntelliJ IDEA、Eclipse、VS Code + Java Extension)在启动时,不会读取系统环境变量 JAVA_HOME 来决定用哪个 JDK。它们要么用自带的 JRE(仅用于运行 IDE 自身),要么依赖用户显式配置的 project SDK 或 java.home 设置——这个配置优先级远高于系统变量。
常见错误现象:
java -version 显示 JDK 17,但 IDEA 新建项目默认用 JDK 11JAVA_HOME,重启 IDE 后毫无反应Unsupported class file major version 65(即用了 JDK 21 编译,但 IDE 实际在用 JDK 17 运行编译器)实操建议:
File → Project Structure → Project → Project SDK,点 New → JDK 指向你本地的 JDK 根目录(如 /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home)Preferences → Java → Installed JREs,Add 一个标准 VM,路径选 JDK 解压后的根目录(不是 jre/ 子目录)"java.home": "/path/to/jdk-21",注意路径不能带 /bin 或 /jre
即使 IDE 的 project SDK 配对了 JDK 21,Maven 和 Gradle 的构建过程仍可能悄悄降级——因为它们各自有独立的 JDK 选择逻辑。
关键差异点:
MAVEN_OPTS 或 maven.compiler.source/target 属性,但最终执行 javac 时,取决于它启动时的 java 可执行文件位置org.gradle.java.home(gradle.properties 中设置)指定 JDK;若未设,则 fallback 到当前 shell 的 $JAVA_HOME;再 fallback 到系统 PATH 中第一个 java
实操建议:
gradle.properties 中明确写:org.gradle.java.home=/path/to/jdk-21
pom.xml 中锁定编译版本:但这不改变21 21
javac 执行路径,只是参数传递Settings → Build → Build Tools → Maven → Importing → JDK for importer,别让它默认勾选 “Use project SDK” —— 这个选项实际是让 Maven 插件用 project SDK 启动 JVM,但不等于用它执行 javac
IDE 内置终端(如 IDEA 的 Terminal 标签页)启动时,通常继承的是操作系统 shell 的环境,而不是 IDE 的 project SDK。所以你在里面执行 java -version 看到的,和 IDE 编译器用的,完全是两码事。
容易被忽略的细节:
~/.zshrc),所以 JAVA_HOME 在那里改才生效
./gradlew)在终端里运行时,完全不看 IDE 设置,只认 org.gradle.java.home 或环境变量验证方式:
echo $JAVA_HOME && java -version
Compile 'Xxx.java',然后看底部 Build 窗口日志里出现的 javac 路径(例如:/path/to/jdk-21/bin/javac)IntelliJ 对多模块 Maven/Gradle 项目,默认把父 pom.xml 或 settings.gradle 的 JDK 当作“根 SDK”,但每个子模块其实可以单独指定 SDK——而这个设置常被忽略或误覆盖。
典型问题:
Project SDK,但下次 Maven reimport 后又自动回退到父项目 SDK实操建议:
Project Structure → Modules 中,逐个选中子模块,取消勾选 Inherit project compile output path,并手动设置 Module SDK
pom.xml 中加:再配合 IDEA 的11
Auto-import 开启,它会尝试按 java.version 匹配已安装的 JDKbuild.gradle 里统一设 sourceCompatibility,改用各子项目单独配置org.gradle.java.home,或者子模块没脱离父项目的 SDK 继承。