问题现象
新建模块时,项目 SDK 和 Language Level 都设为了 1.8,但运行测试时报错:java:无效的目标发行版:17。即使修改了模块的 Language Level 并执行 mvn clean compile,问题依旧。
排查过程
首先检查 pom.xml,确认 <maven.compiler.source> 和 <target> 均为 8。接着查看 IDEA 的 Maven Runner 设置,JRE 也指向了 Project JDK。
真正的问题出在 Java Compiler 设置里。打开 Settings → Build, Execution, Deployment → Compiler → Java Compiler,发现 Per-module bytecode version 表格中,该模块的 Target bytecode version 被强制指定为 17。这个设置优先级高于 Maven 配置。
根本原因
IDE 编译器设置的优先级最高。当 Per-module bytecode version 显式设置了版本(如 17),它会覆盖 POM 文件中的 maven.compiler.target 以及 Project SDK 的设置。
配置优先级顺序(从高到低):
- Java Compiler 的 Per-module 设置(最高优先级)
- Maven 的 compiler 插件配置
- POM 文件中的 maven.compiler.target
- Project SDK 设置
解决方案
- 进入
Settings → Build, Execution, Deployment → Compiler → Java Compiler。 - 在
Per-module bytecode version列表中,找到对应模块,将 Target bytecode version 改为 8 或留空以使用项目默认值。 - 同时检查
Project Structure → Modules中的 Language Level 是否一致。 - 修改后,建议执行
File → Invalidate Caches / Restart并 Reload Project。
最佳实践
创建新模块后,养成检查 Per-module bytecode version 的习惯。保持该设置为空通常能避免此类冲突。如果必须指定,请确保与 Maven 插件配置一致。
常见配置参考
POM 文件中明确指定 compiler 插件配置:
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
或者在 build 标签下配置 plugin:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
<release>8</release>
</configuration>
</plugin>
</plugins>
</build>
快速检查清单
每次创建新模块后:
- 检查 Project Structure → Modules → Language level
- 检查 Settings → Compiler → Java Compiler → Per-module 设置
- 执行一次 mvn clean compile 验证

