Maven没有使用Java 11:错误信息“致命错误编译:无效的目标版本:11”。

98

我正在尝试使用Java 11编译我的项目。

当我尝试以pom.xml中设置的Java版本为Java 8来运行应用程序时,它可以正常工作。但是当我尝试以Java 11运行它时,就会出现错误。

严重错误编译:无效的目标发布版本:11

我已经尝试了各种方式来解决它,例如更改环境变量、更新路径以及将%JAVA_HOME%指向Java 11。

在我的计算机上,命令及其结果如下:

java -version
echo %JAVA_HOME%

输出:

java version "11.0.8" 2020-07-14 LTS
C:\Program Files\Java\jdk-11.0.8

我正在使用IntelliJ IDEA,并按照这个教程中建议的进行了必要的更改。

我的pom.xml文件看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>appengine-maven-plugin</artifactId>
                <version>2.2.0</version>
                <configuration>
                    <version>1</version>
                    <projectId>businessapplication-6963d</projectId>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

当我检查Maven版本时,它显示JDK 1.8作为Java版本:

mvn --version

输出:

Java version: 1.8.0_241, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_241\jre

我该如何让Maven指向Java 11?或者,如果这不是问题,该如何解决这个问题?我不认为这个问题是无效的目标版本:1.7的重复,因为我已经实施了该线程中提供的解决方案。

构建项目后出现错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project demo: Fatal error compiling: invalid target release: 11 -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

路径环境变量是:

C:\Program Files (x86)\Common Files\Intel\Shared Files\cpp\bin\Intel64;
C:\Program Files (x86)\Intel\iCLS Client\;
C:\Program Files\Intel\iCLS Client\;
C:\WINDOWS\system32;C:\WINDOWS;
C:\WINDOWS\System32\Wbem;
C:\WINDOWS\System32\WindowsPowerShell\v1.0\;
C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;
C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;
C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;
C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\WINDOWS\System32\OpenSSH\;
C:\Delhi 2.0\apache-maven-3.6.1\bin;
C:\Program Files\Java\jdk-11.0.8\bin;C:\Program Files\Intel\WiFi\bin\;
C:\Program Files\Common Files\Intel\WirelessCommon\;
C:\Program Files\Git\cmd;D:\Flutter\flutter\flutter\bin;
C:\Users\Infinity97\AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin;
C:\Users\Infinity97\AppData\Local\Microsoft\WindowsApps;
C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.2\bin;
H:\apache-maven-3.6.3\bin;
C:\Program Files\PostgreSQL\12\bin;
C:\Program Files\PostgreSQL\12\lib;
C:\Program Files\Docker Toolbox

1
在终端中,JAVA_HOME指向JDK 11了吗? - Simon Martinelli
你的Path环境变量中是否有其他Java构建? - Giorgi Tsiklauri
1
你总是喜欢创建JAVA_HOME并在home路径之前设置java,然后将%JAVA_HOME%\bin作为路径中的一个条目。不要在PATH变量中硬编码java路径。然后设置M2_HOME并添加一个没有bin文件夹值的maven路径。在PATH变量中将%M2_HOME%\bin设置为值。然后打开新的命令提示符并运行java -version,javac -version mvn -verion和mvn -e clean install。作为@procrastinator,请确保在mvn.bat文件中没有硬编码路径。在执行上述步骤之前,请从java和maven home的PATH变量中删除所有硬编码。 - Amit Vyas
2
@procrastinator 在 mvn.cmd 中更新 JAVA_HOME(在 Maven 3.5 及以上版本中为 mvn.bat 是 mvn.cmd)即可解决问题。您能将此作为答案发布,以便我可以接受它作为答案。非常感谢! - Ayush Surana
一个类似的(并且已经解决!)关于Heroku的Maven JDK的问题:https://dev59.com/2bnoa4cB1Zd3GeqPafEl - Eugene Gr. Philippov
显示剩余14条评论
12个回答

109

看起来你在mvn.bat中设置了JAVA_HOME。它可能指向旧版本的Java(例如,在你的情况下是8)。

set JAVA_HOME=C:\path\to\jdk11。在调用Maven之前尝试在第一行使用它。


如果我的 mvn.bat 使用了 set "JAVACMD=%JAVA_HOME%\bin\java.exe",会怎样呢? - G. Ciardini
在这种情况下,请尝试检查定义为“%JAVA_HOME%”并更新它的变量。 - Procrastinator
我的 %JAVA_HOME%java -version 正在使用 jdk12,所以我必须使用精确的 jdk11 吗? - G. Ciardini
如果你想在你的项目中使用jdk11,那么是的。否则就用jdk12 - Procrastinator
@G.Ciardini,如果您已经安装了JDK12,它可以编译JDK11代码。当您问“我必须使用确切的jdk11吗?”时,答案是否定的。只要您使用JDK11或更高版本进行编译,就可以编译使用Java 11语法编写的代码。 - PatS

19

在尝试将一个 Spring Boot 应用部署到 Heroku 时,我遇到了这个问题。

我的 JAVA_HOME 设置正确,但仍然收到同样的错误。

但是这对我起作用:

在你的 pom.xml 文件中添加或者调整到你自己的上下文:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
</plugin>

49
这只是回退到Java 8,而不是使Java 11可用。 - Scott Baker
我在尝试运行一个Java 8项目时遇到了这个问题(虽然我也安装了Java 11)。这个解决方案完美地解决了问题。 - Tejesh Raut
我将这个插件添加到了我的pox.xml文件中,但是IDE找不到它,应该怎么办? - Guy_g23

8
如果其他人遇到相同的问题,但是使用Eclipse(我知道OP是指IntelliJ IDEA),也请检查Maven所使用的JRE:
  • 运行配置...
  • 选择您的Maven构建配置
  • 单击JRE选项卡,并根据您的POM文件选择JRE版本。

1

我曾经遇到过同样的问题。将JAVA_HOME环境变量设置为正确的JDK版本解决了我的问题。

java -version显示了正确的版本,但是echo %JAVA_HOME%指向了错误的JDK版本。修复这个问题,解决了我的困扰。


1
这是一个重复的答案,已经在这个问题上被接受了。 - Jad
嗨Jad,我添加了这条注释,因为它是为了检查JAVA_HOME而编写的,但我是在检查JAVA_VERSION。所以,我在一个注释中提到了两者。请检查以上所有答案。 - thelearner

1
不要忘记在Eclipse IDE的“Run As”->“Run Configurations”->“JRE”选项卡中适当更改JRE版本。

Run Configurations - JRE Settings


0

我曾经遇到过同样的问题,即使正确的Java版本11和JAVA_HOME变量已设置。

将Java供应商从AdoptOpenJDK切换到Corretto解决了这个问题。

您可以使用SDKMAN轻松快速地在不同的Java版本和供应商之间进行切换(JAVA_HOME变量将由SDKMAN自动正确设置)。

通过以下方式安装SDKMAN:

curl -s "https://get.sdkman.io" | bash

然后在终端中输入:

source "$HOME/.sdkman/bin/sdkman-init.sh"

为确保安装成功:

sdk version

安装Java 11:
sdk install java 11.0.13.8.1-amzn
sdk default java 11.0.13.8.1-amzn

检查版本、运行时和供应商:

java --version
mvn -v

0

我在使用VSCode从Maven打包时遇到了同样的错误。我只需要在pom.xml中的maven-compiler-plugin中添加release元素,就像这样:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
    </plugins>
</build>

感谢必应聊天工具的帮助,解决了这个问题!


添加这个会导致不同的失败,对我来说:致命错误编译...:无效标志:--release - wkhatch

0

最快、最简单的方法是使用SDKMAN https://sdkman.io/

  1. 安装JDK 11:

    sdk install 11.0.11.hs-adpt
    
    • sdk list java 可以查看可用的JDK列表
  2. 在项目主目录下创建 .sdkmanrc 文件:

    java=11.0.11.hs-adpt
    
  3. 切换JDK

    • 使用 sdk env 命令切换到正确的JDK版本。

    • 为了自动切换到所选的jdk版本,请在sdkman配置文件(~/.sdkman/etc/config)中启用它

      sdkman_auto_env=true
      

-2

首次运行

/usr/libexec/java_home -V

这将列出您计算机上所有可能的JAVA_HOME路径。

您有两个选项:

添加该行(项目永久)

JAVA_HOME="/path/to/obtained/from/command/lib"

在你的maven.bat文件中,最好是在初始注释之后。
运行
export JAVA_HOME=/path/to/obtained/from/command/lib

在运行mvnw命令之前。

在Windows上,对吧?这是在哪个版本/版本上测试的?Windows 10? - Peter Mortensen

-3
  1. 检查环境变量中的路径下的Java home。它应该指向您的Java安装目录下的JDK 11,

  2. 检查文件pom.xml中是否有以下内容:

     <properties>
         <java.version>11</java.version>
     </properties>
    
  3. Path下,检查%JAVA_HOME%环境变量的正确条目,并明确设置JAVA_HOME=C:\tools\java\jdk11

  4. 检查mvn是否不会覆盖Java版本11


7
仅仅是回退到Java 8,并不是让Java 11能够运行。 - John Kitonyo
3
这不是这个问题的答案。 - Farhad
这听起来像是在指Windows,是吗? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接