无法使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)。我尝试过多次重启计算机,并验证了正确设置了env var(在中设置了.bash_profile)。

Maven与Homebrew一起安装。

Java 1.8在Eclipse(使用m2e)中运行良好。我只是无法让Maven在命令行上工作。


3
jdk1.8.0_20尚未发布,并且我在目录名中没有看到ea,您确定目录存在吗?
jmj 2014年


@JigarJoshi,这是这里的抢先体验版。
2014年

它有Java编译器ls -la /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/bin/javac吗?
jmj 2014年

Answers:


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令人困惑

我做了以下事情来修复我的环境

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 2014年

我已经扎根但仍然得到rm: CurrentJDK: Operation not permitted
raoulsson

不得不关闭无根:https://www.quora.com/How-do-I-turn-off-the-rootless-in-OS-X-El-Capitan-10-11
raoulsson

46

原来,我有一个忘记了的~/.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

如果可以取消设置,则还应该可以简单地覆盖现有值。
凯特2015年

如果我在〜/ .bashrc中设置JAVA_HOME,它将为整个会话设置,并且如果我运行update-alternatives并保持在同一会话中,则不会更改。我希望大多数应用程序(尤其是目前的Maven)选择由update-alternatives设置的JVM版本。不幸的是,Ubuntu认为这个问题不够重要:bugs.launchpad.net/ubuntu/+source/java-common/+bug/45348
Jakub Kotowski

27

对我有用的解决方案:

在Eclipse中,我的Maven构建中的运行配置错误。去

运行配置-> JRE [Tab]

并将运行时设置为Java 8。


完美的发现...很久以来一直在为此苦苦挣扎...上面的设置有帮助..
Abhijit Bashetti

26

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

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

我必须运行以下命令来获取指向我的JDK 8安装的各种与Java相关的符号链接:

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和Ubuntualternatives有关,而与CentOS / RedHat有关。
PdC

14

您的JAVA_HOME位置已被其他地方覆盖。尝试在mvn调用Java之前立即回显。


1
不知何故,直到太晚我才注意到这个答案,但是它会揭示出~/.mavenrc覆盖JAVA_HOME,所以+1的事实。
2014年

我认为专门设置JAVA_HOME(例如,在.bash_login中使用export JAVA_HOME = /usr/libexex/java_home -v 1.8)是最好的选择
疯狂的2015年

我同意@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]

如果您设置1.11而不是仅11在POM中设置。

不正确:

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

正确:

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

2

我有同样的问题,需要2个步骤才能纠正:

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

对我来说,第一步是正确的,第二步是有问题的。在Eclipse»项目的属性»Build Path»已安装的JRE»中指向JDK。


0

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

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


我到底在找什么?那里有一个JRE文件夹(以及bin,db,lib和include)。据我所知,它似乎与其他JRE相同。我是从jdk8.java.net/download.html下载的。它与Eclipse一起使用(我测试了lambda)。
2014年

1
Java 8的最新版本是1.8.0_05。jdk1.8.0_20-ea表示它是Java 8的第20个早期访问版本,换句话说,它是第20个预告片,最终将变成1.8.0,现在是第5个“修补程序版本”或1.8.0_05。基本上,一旦您获得了非ea构建,就去做吧。
Edwin Buck

我只是尝试了1.8.0_05(实际上,我先尝试了),但Maven仍然无法识别它。我所做的一切都是固定的JAVA_HOME(其他职位似乎暗示这就是所需要的一切)。顺便说一句,1.8.0_05是否比1.8.0_20-ea新?
2014年

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返回值的a(因为它可以独立于重定向您JAVA_HOME,还可以检查PATH环境变量,因为它可能会覆盖java您在检查项目之前发现的环境变量。)
Edwin Buck 2014年

谢谢。那我应该使用1.8.0_05。我对哪个版本是最新版本感到困惑。
2014年

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.