【问题标题】:Can't set JAVA_HOME dynamically on macOS Catalina无法在 macOS Catalina 上动态设置 JAVA_HOME
【发布时间】:2020-11-13 06:33:17
【问题描述】:

tl,博士; 执行 export JAVA_HOME=$(/usr/libexec/java_home -v 14) 一次 JAVA_HOME 已经设置不会改变活动 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 个月前)

有一个看似相似的主题(Can't set JAVA_HOME on Catalina),但归结为不同的外壳。就我而言,我使用的是相同的 shell - 来自 brew 的 bash:

$ 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.

【问题讨论】:

  • 我对macos了解不多,但是有没有等效于window的PATH env变量以便找到java命令?
  • 有,但之前它会自动更新以反映更新的JAVA_HOME(如果您想在当前 shell 中快速切换活动的java 版本,这非常方便)

标签: java bash macos java-home


【解决方案1】:

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

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

【讨论】:

  • 我的.profile 文件中有export PATH=$JAVA_HOME/bin:$PATH。似乎当前为每个 shell 实例设置了 PATH 。在它更加“动态”并且仅更改 JAVA_HOME 之前也反映在 PATH 中。
  • 所以如果你在 shell 中执行 export PATH=$JAVA_HOME/bin:$PATH 然后尝试 java -version 它是否按预期工作
  • 有点,但在那种情况下,我最终会在PATH中找到两个版本的路径
  • 我认为如果您在 .profile 文件中添加以下行,它应该可以工作 export JAVA_HOME=$(/usr/libexec/java_home -v 14)) export PATH=$JAVA_HOME/bin:$PATH
  • 我有!并且设置 java 本身工作得很好。我试图实现的是能够动态切换java版本之后。 IE。我打开新的 shell,有 java11(根据配置文件)但想切换到 java14。以前切换 JAVA_HOME 并指向 java14 就足够了。现在它不起作用,我必须编辑我的配置文件并获取它或打开新会话,然后恢复更改。
【解决方案2】:

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

keg_only "it shadows the macOS `java` wrapper"

然后事情立即“点击”。经过一番搜索,我找到了Why isn't java wrapper not picking up the right version specified in JAVA_HOME on macOS?,这证实了这个问题。通过在我的PATH 文件中的PATH 中包含JAVA_HOME,我破坏了它的java 包装器的本机macOS 功能,它根据当前设置的JAVA_HOME 选择活动的java 版本。

这是我的示例会话(打开 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)

【讨论】:

    猜你喜欢
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多