无法让Maven识别Java 1.8版本

73

我似乎无法让Maven使用Java 1.8。将1.8用作目标时会出现以下错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
(default-compile) on project csaro: Fatal error compiling: invalid target
release: 1.8 -> [Help 1]

错误的原因很明显:Maven没有使用正确版本的Java:

$ mvn -version
Apache Maven 3.2.2 (45f7c06d68e745d05611f7fd14efb6594181933e; 2014-06-17T07:51:42-06:00)
Maven home: /usr/local/Cellar/maven/3.2.2/libexec
Java version: 1.7.0_51, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.9.2", arch: "x86_64", family: "mac"

但是安装的Java版本应该是1.8:

$ java -version
java version "1.8.0_20-ea"
Java(TM) SE Runtime Environment (build 1.8.0_20-ea-b22)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b21, mixed mode)

而且JAVA_HOME已经设置:

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home

我还尝试了这里的命令(用于创建mavenrc文件)。我试过几次重新启动电脑,并确认环境变量已正确设置(在.bash_profile中设置)。

Maven是使用Homebrew安装的。

Java 1.8在Eclipse中工作正常(使用m2e)。我只是无法让Maven在命令行中工作。


3
jdk1.8.0_20 还没有发布,而且我在目录名称中没有看到 ea,你确定该目录存在吗? - jmj
请查看答案:https://dev59.com/U2Ml5IYBdhLWcg3wwZTc。 - Federico Piazza
你看过这个网址吗?https://dev59.com/aHE95IYBdhLWcg3wApBU? - Diogo Moreira
@JigarJoshi,输出在这里 - Kat
我不得不关闭rootless https://www.quora.com/How-do-I-turn-off-the-rootless-in-OS-X-El-Capitan-10-11 - raoulsson
显示剩余11条评论
9个回答

55

对我来说,问题在于当我从jdk-8u25-macosx-x64.dmg安装时,安装程序没有更新/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK目录链接到新的1.8 JDK。这可能不是原始问题的问题,但当我遇到相同的错误消息时,这是我的解决方案。

我不知道为什么安装程序没有进行链接,而且更加混乱的是,路径取决于您是从Oracle还是Apple安装的。请参见Mac OS X 10.6.7 Java Path Current JDK confusing

我采取以下措施来修复我的环境

cd /System/Library/Frameworks/JavaVM.framework/Versions
sudo rm CurrentJDK
sudo ln -s /Library/Java/JavaVirtualMachines/<installed_jdk_version>.jdk/Contents CurrentJDK

4
我也遇到了同样的问题,修复“CurrentJDK”后问题得到了解决。 - MikeB
我是超级用户,但仍然遇到“rm:CurrentJDK:不允许操作”的问题。 - raoulsson
不得不关闭rootless:https://www.quora.com/How-do-I-turn-off-the-rootless-in-OS-X-El-Capitan-10-11 - raoulsson

45

事实证明我忘记了一个~/.mavenrc文件,该文件设置了JAVA_HOME的值。

对于未来的读者,请检查以下位置以查找可能覆盖JAVA_HOME的位置(按优先顺序递增):

  • ~/.bash_profile
  • ~/.bash_login
  • ~/.bashrc
  • ~/.profile
  • /etc/mavenrc
  • ~/.mavenrc

1
我找不到设置JAVA_HOME(不正确)的地方 - 我尝试了您列出的位置,以及许多其他位置(/etc/environment、/etc/profile、/etc/profile.d/*等)。最终,我决定将unset JAVA_HOME放入我的~/.bashrc中 - 这可能是在大多数情况下自动使用Ubuntu的update-alternatives使其正常工作的唯一方法(因为大多数程序会尝试自行确定正确的JAVA_HOME,如果未设置,则它们尝试查找java可执行文件指向的位置是其中的第一件事)。 - Jakub Kotowski
如果你能取消设置它,那么你也应该能够简单地覆盖现有的值。 - Kat
如果我在~/.bashrc中设置JAVA_HOME,它将在整个会话中被设置,并且如果我运行update-alternatives并保持在同一个会话中,它也不会改变。 我希望大多数应用程序,特别是当前的maven,选择update-alternatives设置的JVM版本。 不幸的是,Ubuntu并未认为这个问题足够重要:https://bugs.launchpad.net/ubuntu/+source/java-common/+bug/45348 - Jakub Kotowski

27

对我有效的解决方案:

在Eclipse中,我的Maven构建中运行配置有误。前往

运行配置 -> JRE [标签页]

并将运行时设置为Java 8。


完美找到了...我已经很长时间在努力解决这个问题...上面的设置有所帮助。 - Abhijit Bashetti

27

我在我的CentOS 6.5系统上遇到了同样的问题。

java -version 返回了Java 8版本,但是javac -version返回了Java 7版本。

为了让所有与Java相关的符号链接都指向我的JDK 8安装,我不得不运行以下命令:

sudo alternatives --config java
sudo alternatives --config javac
sudo alternatives --config jre_openjdk
sudo alternatives --config java_sdk_openjdk

2
在我的情况下,它是 sudo update-alternatives --config javac。你确定 "alternatives" 不是拼写错误吗? - PbxMan
update-alternatives 与 Debian 和 Ubuntu 相关,而 alternatives 与 CentOS/RedHat 相关。 - Paulie-C

14

你的JAVA_HOME被其他地方覆盖了。在调用Java之前,在mvn中尝试输出。


1
不知何故,我直到太晚才注意到这个答案,但它会揭示“~/.mavenrc”覆盖了JAVA_HOME的事实,所以+1。 - Kat
我认为特别是设置JAVA_HOME(例如在.bash_login中使用export JAVA_HOME=/usr/libexex/java_home -v 1.8)是最佳选择。 - scravy
我同意@scravy的观点 - export JAVA_HOME=$(/usr/libexec/java_home -v1.8) - joensson

4
请注意,您在使用Java 11时也可能会遇到“无效的目标版本”错误。
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-
plugin:3.8.0:compile (default-compile) on project projects-migration: 
Fatal error compiling: error: invalid target release: 1.11 -> [Help 1]

如果你在POM中设置了1.11而不是只设置11

错误的示例:

<java.version>1.11</java.version>

正确:

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

2

我曾经遇到过同样的问题,需要两个步骤才能解决:

  1. 确保 JAVA_HOME 设置正确,指向 JDK;
  2. 在 Eclipse 中,JDK 和 JRE 应该指向相同的版本。

对于我来说,第一步是正确的,第二步有问题。在 Eclipse 中,选择项目属性 » 构建路径 » 安装的 JRE » 指向 JDK。


0

您正在使用1.8版本的早期访问版本。现在该版本已发布,您应该安装已发布的版本。

检查您的maven安装,看看是否有与之关联的配置指定了特定的JDK。有时候会有包装脚本在maven启动之前重设JAVA_HOME,或者maven可执行文件在一个引用配置文件的包装器中启动,该配置文件可能会将您绑定到特定的JVM。


我到底在找什么?那里有一个JRE文件夹(以及bin、db、lib和include)。据我所知,它似乎与其他JRE相同。我从https://jdk8.java.net/download.html下载了这个文件。并且它可以在Eclipse中使用(我测试了一个lambda函数)。 - Kat
1
Java 8的最新版本是1.8.0_05。 jdk1.8.0_20-ea表示它是Java 8的第20个EARLY ACCESS版本,换句话说,它是最终成为1.8.0的第20个预览版本,而1.8.0现在已经发布了第五个“补丁发布”,即1.8.0_05。基本上,一旦您可以获得非ea版本,请尽快使用。 - Edwin Buck
我刚刚尝试了1.8.0_05(实际上,我首先尝试了这个版本),但Maven仍然无法识别它。我所做的只是设置了JAVA_HOME(其他帖子似乎暗示这就足够了)。顺便问一下,1.8.0_05比1.8.0_20-ea更新吗? - Kat
1
是的,1.8.0_20-ea比1.8.0_05早。从最旧到最新,它们的顺序是1.8.0_20-ea、1.8.0、1.8.0_05。请检查一些事情。使用which java命令,然后对返回值进行ls -l操作(因为它可能会独立于JAVA_HOME重定向你),还要检查你的PATH环境变量,因为它可能会在你检查的项目之前覆盖找到的java - Edwin Buck
谢谢。那我应该使用1.8.0_05版本。我对哪个版本是最新版本感到困惑。 - Kat

0

如果您在持续集成服务器中使用Maven,请确保检查其设置,因为它可能会覆盖Maven使用的JDK。对于Jenkins,我必须在常规设置中添加新的1.8 JDK,并配置我的项目以使用它。


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