You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已设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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:22:52