(以下操作全部在Mac OS系统上进行)
- JAVA_HOME问题
安装Maven后,我们必须设置JAVA_HOME环境变量,这样工具就知道在哪里可以找到要执行的JDK命令。Maven 目标针对项目的源代码运行适当的 Java 命令。
例如,最常见的场景是通过执行javac命令来编译代码。
如果JAVA_HOME未指向有效的 JDK 安装,Maven 将在每次执行时抛出错误。
# Output...
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK, not a JRE
- Maven如何验证JAVA_HOME路径
在运行任何目标之前,Maven 会检查JAVA_HOME指定的路径中是否存在java命令,或者通过向操作系统询问默认的 JDK 安装。 如果未找到可执行文件,Maven 将因错误而终止。
这是Linux (Apache Maven v3.5.4)的mvn可执行文件检查:
if [ -z "$JAVA_HOME" ] ; then
JAVACMD=`which java`
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
echo "The JAVA_HOME environment variable is not defined correctly" >&2
echo "This environment variable is needed to run this program" >&2
echo "NB: JAVA_HOME should point to a JDK not a JRE" >&2
exit 1
fi
这种检查乍一看似乎很合理,但我们必须考虑到JDK 和 JRE 都有一个bin文件夹,并且都包含一个可执行的java文件。
因此,可以将JAVA_HOME配置为指向 JRE 安装,隐藏此特定错误并在稍后阶段引起问题。 虽然 JRE 的主要目的是运行 Java 代码,但 JDK 也可以编译和调试 其他重要差异。
出于这个原因, mvn compile 命令会失败——我们将在下一小节中看到。
- 由于JRE而不是JDK导致编译失败
与通常的默认设置一样,如果我们有“标准”配置,它们将非常有用。
例如,如果我们在 Ubuntu 18.04 系统上安装 Java 11 并且不设置JAVA_HOME环境变量,Maven 仍然会很顺利地找到我们的 JDK 并将其用于不同的目标,包括编译。 - 检查JAVA_HOME配置
只需打开一个终端并输入:
$JAVA_HOME/bin/javac -version
如果JAVA_HOME指向 JDK,则输出应如下所示:
javac 1.X.0_XX
如果 JAVA_HOME不指向 JDK,操作系统将抛出错误消息:
bash: /bin/javac: No such file or directory
- 如何解决问题
从 OS X 10.5 开始,Apple 引入了一个命令行工具( /usr/libexec/java_home ),它可以为当前用户动态查找 Java 首选项中指定的顶级 Java 版本。
在任何文本编辑器中打开~/.bash_profile并添加:
export JAVA_HOME=$(/usr/libexec/java_home)
保存并关闭文件。
打开终端并运行 source 命令以应用更改:
source ~/.bash_profile
现在我们可以检查JAVA_HOME变量的值:
echo $JAVA_HOME
结果应该是JDK安装的路径:
/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home
现在我们找到了jdk的目录,下面设置环境变量就好了。
在任何文本编辑器中打开 ~ /.bashrc并添加:
export JAVA_HOME=/path/to/java_installation
保存并关闭文件。
运行 source 命令加载变量:
source ~/.bashrc
现在我们可以检查JAVA_HOME变量的值:
echo $JAVA_HOME
结果应该是JDK安装的路径:
/usr/lib/jvm/java-8-oracle
- 以上就可以解决这个问题。
参考: https://www.baeldung.com/maven-java-home-jdk-jre