已设JAVA_HOME为JDK 17,Maven仍默认用JDK 8,如何解决?
问题描述
执行mvn clean install时反复遇到编译错误:
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project test: Fatal error compiling: invalid target release: 17
删除JDK 8后问题暂时解决,但为其他项目重装JDK 8后错误复发。
当前使用JEnv管理JDK版本,全局已设置为17:
▶ jenv versions system 1.8.0.372-internal 17.0 17.0.7 openjdk64-1.8.0.372-internal * oracle64-17.0.7 (set by /Users/vijay/.jenv/version)
JAVA_HOME已指向JDK 17:
▶ echo $JAVA_HOME /Users/vijay/.jenv/versions/oracle64-17.0.7
但mvn -version显示Maven实际使用的是JDK 8:
▶ mvn -version Apache Maven 3.9.2 (c9616018c7a021c1c39be70fb2843d6f5f9b8a1c) Maven home: /usr/local/Cellar/maven/3.9.2/libexec Java version: 1.8.0_372-internal, vendor: OpenLogic-OpenJDK, runtime: /Library/Java/JavaVirtualMachines/openlogic-openjdk-8.jdk/Contents/Home/jre Default locale: en_US, platform encoding: UTF-8 OS name: "mac os x", version: "13.3.1", arch: "x86_64", family: "mac"
项目pom.xml已明确配置JDK 17:
<properties> <maven.compiler.target>17</maven.compiler.target> <maven.compiler.source>17</maven.compiler.source> </properties> ... ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>1.4.1</version> <executions> <execution> <id>enforce</id> <configuration> <rules> ... <requireJavaVersion> <version>17</version> </requireJavaVersion> ... </rules> </configuration> <goals> <goal>enforce</goal> </goals> </execution> </executions> </plugin> </plugins>
目前有一个临时解决方法,但操作繁琐:
cd jdk-8-project jenv local openjdk64-1.8.0.372-internal mvn clean install # 临时"卸载"JDK 8 sudo mv /Library/Java/JavaVirtualMachines/openlogic-openjdk-8.jdk ~/Desktop/ cd jdk-17-project jenv local 17.0.7 mvn clean install # 恢复JDK 8 sudo mv ~/Desktop/openlogic-openjdk-8.jdk /Library/Java/JavaVirtualMachines/
如何让Maven严格遵循$JAVA_HOME的设置?
解决方法
1. 确保JEnv正确Hook Shell
Maven可能未读取到JEnv设置的环境变量,需检查shell配置文件(如~/.zshrc、~/.bashrc)是否添加了JEnv初始化脚本:
export PATH="$HOME/.jenv/bin:$PATH" eval "$(jenv init -)"
添加后重启终端,再次执行mvn -version确认Java版本是否匹配JEnv设置。
2. 强制Maven使用指定JDK
全局配置(所有项目生效)
编辑~/.m2/settings.xml(无则新建),添加JDK 17的强制配置:
<settings> <profiles> <profile> <id>jdk-17</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion> <JAVA_HOME>/Users/vijay/.jenv/versions/oracle64-17.0.7</JAVA_HOME> </properties> </profile> </profiles> </settings>
项目单独配置(仅当前项目生效)
在项目pom.xml中给maven-compiler-plugin指定JDK路径,开启fork强制使用指定编译器:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>17</source> <target>17</target> <executable>/Users/vijay/.jenv/versions/oracle64-17.0.7/bin/javac</executable> <fork>true</fork> </configuration> </plugin>
3. 修复JEnv配置冲突
执行jenv doctor检查JEnv配置问题,根据提示修复路径或映射错误;再执行jenv rehash更新JEnv的命令映射,确保java、javac等命令指向JEnv管理的版本。
4. 终端会话隔离
切换JDK版本时,为不同项目打开独立终端会话,设置好jenv local后再执行Maven命令,避免跨会话的环境变量干扰。
内容的提问来源于stack exchange,提问作者user8056182
相关产品推荐
相关产品推荐

