无法在 macOS Catalina 上动态设置 JAVA_HOME

Can't set JAVA_HOME dynamically on macOS Catalina

tl,博士; 一旦 JAVA_HOME 已经设置,执行 export JAVA_HOME=$(/usr/libexec/java_home -v 14) 将不会改变活动 java


步骤

  1. 首先设置JAVA_HOME(例如export JAVA_HOME=$(/usr/libexec/java_home -v 11)):
$ echo ${JAVA_HOME}
/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home

$ java -version
openjdk version "11.0.8" 2020-07-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.8+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.8+10, mixed mode)
  1. 尝试将其设置为不同的版本(例如 export JAVA_HOME=$(/usr/libexec/java_home -v 14))- 它仍然使用之前设置的 java(即使 JAVA_HOME 已更新):
$ echo ${JAVA_HOME}
/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home

$ java -version
openjdk version "11.0.8" 2020-07-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.8+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.8+10, mixed mode)

我不确定为什么它现在不工作了 - 前一段时间工作得很好(我想是 2-3 个月前)

有一个看似相似的主题(),但归结起来却是不同的shell。在我的例子中,我使用相同的 shell - bash from brew:

$ bash -version
GNU bash, version 5.0.18(1)-release (x86_64-apple-darwin19.5.0)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

似乎更新 JAVA_HOME 没有反映在 PATH 变量中。

因此,请同时更新 PATH 变量并将更新后的 JAVA_HOME 作为导出 PATH 命令中的第一个元素

好的,我终于设法解决了这个问题。正如其他人指出的那样,一切都与 PATH 变量有关。我确实有 JAVA_HOME/bin 在那里......这导致了问题。今天在更新期间我注意到 openjdk brew formula 有这样的评论:

keg_only "it shadows the macOS `java` wrapper"

然后事情立即“点击”。经过一番搜索后,我发现 证实了这个问题。通过在我的 .profile 文件的 PATH 中包含 JAVA_HOME,我破坏了它的 java 包装器的本机 macOS 功能,它根据当前设置选择活动的 java 版本JAVA_HOME.

这是我的示例会话(从打开 shell 并在 .profile 文件中包含 export JAVA_HOME=$(/usr/libexec/java_home -v 11))——我在配置文件中有默认设置,然后我明确设置 JAVA_HOME 并即时切换 java 版本:

$ java -version
openjdk version "11.0.8" 2020-07-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.8+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.8+10, mixed mode)

$ export JAVA_HOME=$(/usr/libexec/java_home -v 14)

$ java -version
openjdk version "14.0.2" 2020-07-14
OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.2+12)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.2+12, mixed mode, sharing)