maven项目实际使用的jdk由maven-compiler-plugin的fork+executable配置决定,而非java_home;启用fork=true且executable指向有效javac路径时,该路径优先级最高,会完全忽略java_home和idea的runner jre设置。

Maven项目用哪个JDK,不是看JAVA_HOME,而是看三处配置是否对齐:插件参数、插件executable路径、IDE的Project SDK。
为什么改了JAVA_HOME但Maven还是用错JDK
因为Maven默认只读JAVA_HOME启动自己(比如mvn命令本身),但编译Java源码时,maven-compiler-plugin可能绕过它——尤其当你显式配置了executable或启用了fork。
- 没配
fork=true时,executable字段完全被忽略 - 配了
fork=true但executable路径不存在,会直接报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile+Cannot run program "/wrong/path/javac" -
source和target只控制字节码兼容性,不决定实际用哪个JDK编译;它们和executable指向的JDK版本不一致时,编译可能成功但运行时报UnsupportedClassVersionError
maven-compiler-plugin里怎么指定真实JDK路径
必须同时满足两个条件才生效:启用fork + 给出正确的executable绝对路径。推荐用环境变量解耦,避免硬编码:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-compiler-plugin</artifactid><version>3.11.0</version><configuration><source>17</source><target>17</target><fork>true</fork><executable>${env.JAVA_HOME_17}/bin/javac</executable></configuration></plugin>
-
${env.JAVA_HOME_17}需在系统中提前定义,例如Linux下export JAVA_HOME_17=/usr/lib/jvm/java-17-openjdk - Windows用户注意路径分隔符,用
${env.JAVA_HOME_17}\bin\javac - 别漏掉
<fork>true</fork>,否则executable是摆设
IDEA里Maven编译和Project SDK不一致怎么办
IntelliJ IDEA有两个独立开关:一个是“Maven runner用的JDK”(影响mvn compile等命令),另一个是“Project SDK”(影响代码补全、语法检查)。两者不同步很常见,也会导致编译结果和IDE提示矛盾。
- 设置Maven runner JDK:File → Settings → Build, Execution, Deployment → Build Tools → Maven → Runner → JRE
- 设置Project SDK:File → Project Structure → Project → Project SDK
- 如果项目pom.xml里还写了
<executable></executable>,它会优先于IDEA的Runner JRE设置 - 执行
Maven → Reload project后,IDEA不会自动同步Project SDK;得手动点“Project SDK”下拉框重新选一次
最易被忽略的一点:当maven-compiler-plugin配置了executable且fork=true时,Maven彻底无视JAVA_HOME和IDEA的Runner JRE设置——它只认那个路径下的javac。路径写错、权限不足、JDK版本缺失,都会让编译在无声中失败,而不是报“JDK版本不匹配”。










