直接在pom.xml中配置maven-compiler-plugin可精准控制源码语法和字节码版本;推荐用<release>替代<source>/<target>以自动约束语法、字节码与启动类路径,避免兼容问题。

直接在 pom.xml 中配置 maven-compiler-plugin,就能明确控制源码语法版本和生成字节码的兼容级别。关键不是换 JDK 路径,而是告诉 Maven “按哪个 Java 规范来读代码、生成 class 文件”。
用 properties 简洁统一指定
适合多模块项目,父 POM 里写一次,所有子模块自动继承:
- 在
<properties>块中添加两行:
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
这样就设定了源码支持 Java 17 语法(如 var、sealed 类),且生成的 class 文件能在 JDK 17+ 运行时加载。无需插件声明,Maven 会自动应用默认插件。
用 plugin 配置更精细控制
当需要额外参数(如编码、编译警告、跳过测试)或想显式锁定插件版本时,推荐这种方式:
立即学习“Java免费学习笔记(深入)”;
- 在
<build><plugins>中加入完整插件配置:
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.12.0</version>
<configuration>
<source>21</source>
<target>21</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
注意:<source> 和 <target> 通常保持一致;若需向下兼容(比如用 Java 21 写代码但部署到 JDK 17 环境),可设 <source>21</source> + <target>17</target>,但源码中不能使用 JDK 17 之后才引入的 API。
为什么改了不生效?常见原因
配置写对了,但 IDE 或命令行仍报错旧版本,往往卡在这几个环节:
- IDE(如 IntelliJ/Eclipse)没刷新 Maven 项目:右键项目 → Maven → Reload project(IntelliJ)或 Update project(Eclipse)
- 本地
JAVA_HOME指向低版本 JDK:Maven 编译器插件虽指定了source/target,但底层仍调用$JAVA_HOME/bin/javac;若source=21但JAVA_HOME是 JDK 8,会直接编译失败 - 同时存在
properties和plugin配置:后者优先级更高,但若插件未声明<configuration>,可能回退到 properties 或默认值
进阶:绑定具体 JDK 路径(非必须)
多数场景只需 source/target;真要强制用某路径下的 JDK(比如机器上装了 JDK 8/17/21,而当前 JAVA_HOME 是 8),可用 toolchains.xml + maven-toolchains-plugin,或在 plugin 中加:
<fork>true</fork>
<executable>/path/to/jdk21/bin/javac</executable>
</configuration>
但需确保 fork=true,否则 executable 不生效。


















