Project SDK 和 Module SDK 必须显式对齐 JDK 版本,不能依赖继承;需在 Project Structure → Modules 中为每个模块手动选择具体 JDK(如17),并同步设置 Language level ≤ SDK 版本,同时清理缓存、校准 Maven/Gradle 配置。

IDEA 里 Project SDK 和 Module SDK 必须显式对齐 JDK 版本
很多人以为设了 Project SDK 就万事大吉,结果模块里代码用 var 还是标红,或者编译报 java: cannot access java.lang.Object。根本原因是:IDEA 的模块 SDK 默认继承 Project SDK,但这个“继承”不保证语言级别和字节码版本同步生效,尤其在 Maven/Gradle 同步后会被悄悄重置。
实操建议:
- 打开
File → Project Structure → Modules,逐个检查每个模块的Module SDK下拉框 —— 不要选Inherit project SDK,手动选中你确认的 JDK(如17 (java version "17.0.8")) - 同时确认该模块的
Language level设置为对应值(如17 - Sealed types, pattern matching for switch),它必须 ≤ SDK 版本,且不能高于 Project Language Level - 多模块项目中,父模块改了,子模块不会自动跟着改;哪怕 pom.xml 里写了
,IDEA 也不会自动同步到模块 SDK17
Maven 的 maven-compiler-plugin 配置必须显式声明 source 和 target
只靠 不够。Maven 官方插件从 3.8.1 开始默认不读取该 property,除非你在 maven-compiler-plugin 里明确写死。
常见错误现象:IDEA 里能编译运行,但命令行执行 mvn compile 报 source release 17 requires target release 17。
正确写法(放在 pom.xml 的 中):
<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-compiler-plugin</artifactid><version>3.11.0</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin>
注意: 和 必须一致,否则 IDEA 和 Maven 行为可能错位; 可选,但若启用(如 ),会强制使用系统模块图校验,要求 JDK 17+ 构建环境。
Gradle 项目别只靠 java { version = "17" }
Gradle 7.6+ 推荐用 toolchain,而不是过时的 sourceCompatibility。后者只影响编译器行为,不约束运行时 JVM;前者能确保编译、测试、运行全部绑定到同一 JDK 实例。
容易踩的坑:
- 只写
sourceCompatibility = JavaVersion.VERSION_17,没配targetCompatibility—— Gradle 7+ 已废弃后者,但旧脚本残留会导致 IDE 误判 - 没启用
javaToolchain,导致 CI 环境用 JDK 21 编译,本地用 JDK 17 运行,出现UnsupportedClassVersionError
推荐写法(build.gradle):
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
这样 Gradle 会自动找系统里第一个匹配的 JDK 17,IDEA 导入项目时也会据此设置模块 SDK(前提是未手动覆盖)。
改完配置后缓存不清理,等于白改
IDEA 的 .idea/misc.xml 和 .idea/modules.xml 会缓存旧 SDK 路径和语言级别,即使你改了 Project Structure,也不一定实时生效。
必须做的三件事:
- 执行
File → Invalidate Caches and Restart → Invalidate and Restart(不是“Just Restart”) - 重启后,右下角留意是否显示
JDK 17提示;如果还是显示JDK 5或空,说明某处配置没到位 - 检查
out/production目录是否被清空 —— 如果没清,说明编译输出仍是旧字节码,得手动删掉再 rebuild
最隐蔽的问题:某些老项目在 .iml 文件里硬编码了 jdkType="JavaSDK" jdkName="1.5",这种必须手动编辑文件删掉或替换,IDEA 不会主动提示。











