Maven:JAVA_HOME环境变量未正确定义,尽管看起来是正确的。

3

我无法在MacOS终端上运行Maven,因为它显示:

JAVA_HOME环境变量定义不正确,该环境变量需要运行此程序。

每一篇与该问题有关的Google搜索结果都说不要在你的export命令中加入空格...但事实并非如此简单...下面是一些输出内容:

export JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home'
mvn -version

The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.

ls $JAVA_HOME

COPYRIGHT               THIRDPARTYLICENSEREADME.txt     jmc.txt                 man
LICENSE                 bin                             jre                     release
README.html             include                         legal                   src.zip
THIRDPARTYLICENSEREADME-JAVAFX.txt                      javafx-src.zip          lib

$JAVA_HOME/bin/java -version

java version "1.8.0_311"
Java(TM) SE Runtime Environment (build 1.8.0_311-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)
michael on Mikes-MacBook-Pro (c for commands)

mvn

The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.

export JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home'
echo $JAVA_HOME

/Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home

export JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home'
echo $JAVA_HOME

/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home

我甚至将我的.bash_profile移动到另一个文件夹并开始了新的会话。我还尝试过使用brew uninstall然后使用brew install...但没有成功。

有什么想法吗?

编辑:

在mvn命令中,这是一个脚本,显然它失败了:

if [ -z "$JAVA_HOME" ] ; then
  JAVACMD="`\\unset -f command; \\command -v 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
  exit 1
fi

我复制了这一行

JAVACMD="$JAVA_HOME/bin/java"

然后使用它... 这是我的结果... 所以不知道为什么在脚本内部失败 - 但我对bash脚本的了解非常有限。

JAVACMD="$JAVA_HOME/bin/java"
$JAVACMD -version

java version "1.8.0_311"
Java(TM) SE Runtime Environment (build 1.8.0_311-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)

我甚至将脚本修改为这样
echo $JAVACMD
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
  exit 1
fi

这是我的输出结果

mvn

/Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home/bin/java
The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.

接下来,我从if then语句中删除了负面测试,以使其通过,现在它显示如下:

mvn

/usr/local/Cellar/maven/3.8.5/libexec/bin/mvn: line 194: /Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home/bin/java: No such file or directory
/usr/local/Cellar/maven/3.8.5/libexec/bin/mvn: line 194: exec: /Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home/bin/java: cannot execute: No such file or directory

我将检查那个Library文件夹中的文件夹权限。


1
这个问题可能更适合[su]。 - Turing85
@ThorbjørnRavnAndersen - 你说得对,这是一个脚本...但它也是一个干净的脚本,只是卸载了、重新下载了maven然后安装。但我正在仔细查看它,看是否有任何明显的问题。 - Michael Sims
@g00se find命令的输出如下:/Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/bin/javac。这是正确的,我已经在Mac上使用Java SDK工作多年了... - Michael Sims
好的。所以这可能是“正确”的;奇怪的是,在我的Linux系统上,如果没有设置$JAVA_HOME,Maven不会抱怨。 - g00se
@ThorbjørnRavnAndersen - 我在聊天中接过g00se给我们链接的对话,但如果你没有到那里去...请看一下我在我的OP中的最后更新。看起来maven的路径是正确的,但由于某种原因它无法访问路径中的任何文件...我正在调查这个问题...但如果你没有告诉我mvn是一个脚本,我就不会走到这一步...我以为它是一个编译好的程序,所以谢谢你。 - Michael Sims
显示剩余6条评论
1个回答

4
最终问题的原因是mvn命令(再次强调,它是一个脚本,而非编译程序)调用了$HOME/.mavenrc文件,并且在该文件中,为$JAVA_HOME赋值了不同的路径,这个路径与我的路径相同,但它尝试访问的是 jdk17.0.1,而我早就卸载了那个jdk,已经忘记了我删除了它。
尽管如此,人们期望执行的命令依赖于当前环境变量,而不是引用其他具有现有环境变量重新定义的文件。
我指责Maven没有先检查所需路径的当前环境,而是转向以前定义的路径。

这真的很令人沮丧。Maven,请保持稳定。我花了大约一个小时来调试这个问题!!谢谢Michael! - ios_mxe

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