无法让 Maven 识别 Java 1.8

Posted

技术标签:

【中文标题】无法让 Maven 识别 Java 1.8【英文标题】:Can't get Maven to recognize Java 1.8 【发布时间】:2014-09-02 13:26:21 【问题描述】:

我似乎无法让 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

我还尝试了command here(它创建了mavenrc)。我试过几次重启电脑,并验证了env var设置正确(它设置在.bash_profile中)。

Maven 是随 Homebrew 一起安装的。

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

【问题讨论】:

jdk1.8.0_20还没有发布,我在目录名中没有看到ea,你确定目录存在吗? 查看答案***.com/questions/18144660/what-is-path-of-jdk-on-mac。 @JigarJoshi,这是here的抢先体验版。 是否有java编译器ls -la /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/bin/javac 你看到这个***.com/questions/2503658/…了吗? 【参考方案1】:

对我来说,问题是当我从 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

【讨论】:

同样的问题,修复“CurrentJDK”为我解决了这个问题。 我是 root 但仍然得到rm: CurrentJDK: Operation not permitted 必须关闭无根:https://www.quora.com/How-do-I-turn-off-the-rootless-in-OS-X-El-Capitan-10-11【参考方案2】:

原来我有一个忘记的~/.mavenrc 文件,它设置了JAVA_HOME 的值。

对于未来的读者,请检查以下位置是否有可能覆盖 JAVA_HOME 的位置(按优先级升序排列):

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

【讨论】:

我找不到设置 JAVA_HOME 的位置(不正确) - 我尝试了您列出的那些,以及更多(/etc/environment、/etc/profile、/etc/profile .d/*, ...)。最后,我决定将unset JAVA_HOME 放在我的~/.bashrc 中——在大多数情况下,这可能是目前使其与Ubuntu 的update-alternatives 自动工作的唯一方法(因为大多数程序都试图自己找出正确的JAVA_HOME,如果它没有设置,他们尝试的第一件事就是查看 java 可执行文件指向的位置)。 如果您可以取消设置,您也应该能够简单地覆盖现有值。 如果我在 ~/.bashrc 中设置 JAVA_HOME,它将为整个会话设置,并且如果我运行 update-alternatives 并保持在同一个会话中,则不会更改。我希望大多数应用程序,尤其是目前的 maven,选择由 update-alternatives 设置的 JVM 版本。不幸的是,Ubuntu 并不认为这个问题足够重要:bugs.launchpad.net/ubuntu/+source/java-common/+bug/45348【参考方案3】:

对我有用的解决方案:

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

运行配置 -> JRE [选项卡]

并将运行时设置为 Java 8。

【讨论】:

完美的发现......长期以来一直在努力解决这个问题......以上设置有帮助......【参考方案4】:

我在 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

【讨论】:

在我的例子中是 sudo update-alternatives --config javac 你确定“alternatives”不是错字吗? update-alternatives 与 Debian 和 Ubuntu 相关,而 alternatives 与 CentOS/RedHat 相关。【参考方案5】:

您的JAVA_HOME 正在被其他地方覆盖。在调用 java 之前尝试在 mvn 中回显。

【讨论】:

不知何故,我直到为时已晚才注意到这个答案,但它会揭示~/.mavenrc 覆盖 JAVA_HOME 的事实,所以 +1。 我认为专门设置 JAVA_HOME(例如在 .bash_login 中使用 export JAVA_HOME=/usr/libexex/java_home -v 1.8)是最好的选择 我同意@scravy - export JAVA_HOME=$(/usr/libexec/java_home -v1.8)【参考方案6】:

请注意,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>

【讨论】:

【参考方案7】:

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

    确保 JAVA_HOME 设置为正确指向 JDK; eclipse中的JDK和JRE应该指向同一个版本。

对我来说,第一步是正确的,第二步有问题。在eclipse » Project's properties » Build Path » Installed JRE » point to JDK.

【讨论】:

【参考方案8】:

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

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

【讨论】:

我到底在寻找什么?那里有一个 JRE 文件夹(以及 bin、db、lib 和 include)。据我所知,它似乎与其他 JRE 相同。我从jdk8.java.net/download.html 下载了这个。它适用于 Eclipse(我测试了一个 lambda)。 Java 8 的最新版本是 1.8.0_05。 jdk1.8.0_20-ea 表示它是 Java 8 的第 20 个 EARLY ACCESS 版本,换句话说,最终将成为 1.8.0 的第 20 个偷窥版本,现在是它的第五个“补丁版本”或 1.8.0_05。基本上,一旦你能得到一个非 ea 的构建,就去做吧。 我刚试了1.8.0_05(其实我先试了),Maven还是不认识。我所做的只是设置JAVA_HOME(其他帖子似乎暗示这就是所需要的)。顺便说一句,1.8.0_05 是否比 1.8.0_20-ea 更新? 是的,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您正在检查的项目。 谢谢。那我应该使用 1.8.0_05 。我对哪个版本是最新版本感到困惑。【参考方案9】:

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

【讨论】:

以上是关于无法让 Maven 识别 Java 1.8的主要内容,如果未能解决你的问题,请参考以下文章

Maven 构建中的错误:无法识别 mvn.bat

Java 上的 Sikuli 无法识别图像

idea的maven项目无法引入junit

SpringBoot 无法从多模块 Java 应用程序中的另一个模块识别 RestController

无法让 IntelliJ 识别 proto 编译的 Java 类文件

Maven Eclipse (m2e) SCM connector for subclipse 1.10 (svn 1.8) 无法检测