Maven使用了错误的Java版本。

7

我正在尝试在CentOS 8上构建一个Maven项目。我想让Maven使用Java版本15。当我运行mvn package时,会出现以下错误:

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile 
(default-compile) on project systembrett-backend: Fatal error compiling: invalid target release: 15 -> [Help 1]

我怀疑 Maven 使用了错误的 Java 版本,因为当我执行mvn package -X以获取调试日志时,它的输出开始为:

Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_275, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.275.b01-1.el8_3.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-240.1.1.el8_3.x86_64", arch: "amd64", family: "unix"

看起来,Maven 正在使用 Java 版本 1.8。 但是 mvn -version 命令输出的结果为:

Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 15.0.2, vendor: AdoptOpenJDK, runtime: /opt/jdk-15.0.2+7
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-240.1.1.el8_3.x86_64", arch: "amd64", family: "unix"

JAVA_HOME/opt/jdk-15.0.2+7PATH/opt/jdk-15.0.2+7/bin:/home/username/.local/bin:/home/username/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

我以为Maven通过检查JAVA_HOME来选择Java版本,但明显它在构建时使用了其他版本。有人知道如何告诉Maven使用正确的版本吗? 谢谢!


也许你的pom.xml正在覆盖maven-compiler-plugin配置 - rkosegi
2个回答

8

以下是我用来解决这种问题的步骤列表:

  1. Linux通常使用alternatives来确保正确的默认Java环境被使用。类似于:
$ alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
 + 1           java-1.7.0-openjdk.x86_64 (/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.191-2.6.15.4.el7_5.x86_64/jre/bin/java)
*  2           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64/jre/bin/java)

也尝试使用javac,因为它可能没有配置相同的方式:

$ alternatives --config javac
  1. 对于你的maven实例,只需要配置JAVA_HOME就可以了。

你的mvn -version输出表明你已经正确配置了它。为确保JAVA_HOMEmvn找到正确的Java,请从PATH中删除Java。

  1. pom.xml文件也可以像下面这样配置所需的编译器:
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
  • 另一个可能是你没有使用相同的环境变量(不同的终端可能没有导出相同的环境变量 - 我假设你在使用CentOS时已经遇到过这个问题)。你需要退出终端然后重新进入,以允许默认变量生效。
  • 通常情况下,当使用不同的JRE和JDK时会遇到此问题(更多信息:maven安装的运行时是JRE而不是JDK)。


    谢谢!在安装新的JDK时,有没有自动选择替代方案的方法? - RahulDeep Attri
    1
    每个发行版都有不同的惯例。发行版软件包(例如.rpm.deb等)负责管理替代方案。alternatives也可以在用户级别上使用配置管理框架或手动配置。如有需要,请随时提出另一个stackoverflow问题,并我们会一起解决。 - azbarcea

    3

    我在RHEL 9.1上遇到了同样的问题。解决方法是查看/etc/java/maven.conf文件,并在此文件中设置正确的JAVA_HOME

    换句话说,您可以将类似于以下内容的单行添加到maven.conf文件中:

    JAVA_HOME=/usr/lib/jvm/java-17-openjdk
    

    你应该没问题了。


    目前你的答案写得不够清晰。请[编辑]以添加更多细节,帮助他人了解这如何回答所提出的问题。你可以在帮助中心找到更多有关编写好答案的信息。 - Community
    1
    我编辑了我的 /etc/java/maven.conf 文件以使用 /usr/lib/jvm/jre,这样在更改 Java 版本时可以正常工作,使用 alternatives --config java 命令。如果路径设置为 /usr/lib/jvm/jre-openjdk,那么需要使用 alternatives --config java_sdk_openjdk 命令进行更新。 - samael

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