【问题标题】:/usr/libexec/java_home -v <version> finds the right JDK version but updates it only the first time/usr/libexec/java_home -v <version> 找到正确的 JDK 版本,但仅在第一次更新
【发布时间】:2021-03-26 16:31:08
【问题描述】:

我刚买了一台带有 M1 处理器的 mac mini,我觉得这种行为很奇怪。基本上,在运行/usr/libexec/java_home -v ## 时,我可以看到只有第一次找到并替换了JDK 路径。如果我第二次运行它,即使带有 -V 标志,我看到它找到了正确的 JDK 路径,但它永远不会替换旧路径,实际上使整个事情变得陈旧。

知道为什么吗?这是取自我的终端的示例。

lda@Lucios-Mac-mini ~ % /usr/libexec/java_home -V   
Matching Java Virtual Machines (3):
    15 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 15" /Library/Java/JavaVirtualMachines/adoptopenjdk-15.jdk/Contents/Home
    13.0.5.1 (arm64) "Azul Systems, Inc." - "Zulu 13.35.1017" /Library/Java/JavaVirtualMachines/zulu-13.jdk/Contents/Home
    11.0.9.1 (arm64) "Azul Systems, Inc." - "Zulu 11.43.1015" /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/adoptopenjdk-15.jdk/Contents/Home

lda@Lucios-Mac-mini ~ % java --version              
openjdk 15 2020-09-15
OpenJDK Runtime Environment AdoptOpenJDK (build 15+36)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 15+36, mixed mode, sharing)

lda@Lucios-Mac-mini ~ % export JAVA_HOME=$(/usr/libexec/java_home -v11) 

lda@Lucios-Mac-mini ~ % java --version                                 
openjdk 11.0.9.1 2020-11-04 LTS
OpenJDK Runtime Environment Zulu11.43+1015-CA (build 11.0.9.1+1-LTS)
OpenJDK 64-Bit Server VM Zulu11.43+1015-CA (build 11.0.9.1+1-LTS, mixed mode)

lda@Lucios-Mac-mini ~ % export JAVA_HOME=$(/usr/libexec/java_home -v15)

lda@Lucios-Mac-mini ~ % java --version                                 
openjdk 11.0.9.1 2020-11-04 LTS
OpenJDK Runtime Environment Zulu11.43+1015-CA (build 11.0.9.1+1-LTS)
OpenJDK 64-Bit Server VM Zulu11.43+1015-CA (build 11.0.9.1+1-LTS, mixed mode)

lda@Lucios-Mac-mini ~ % export JAVA_HOME=$(/usr/libexec/java_home -v13)

lda@Lucios-Mac-mini ~ % java --version                                 
openjdk 11.0.9.1 2020-11-04 LTS
OpenJDK Runtime Environment Zulu11.43+1015-CA (build 11.0.9.1+1-LTS)
OpenJDK 64-Bit Server VM Zulu11.43+1015-CA (build 11.0.9.1+1-LTS, mixed mode)

【问题讨论】:

  • /usr/libexec/java_home -v15 打印什么?如果它不打印任何内容,您需要弄清楚是什么让java_home 打印到版本 15 的路径。
  • v15 也是 x86 而不是 arm...
  • 即使我在 11 和 13 之间尝试,我也会得到相同的结果。无论如何,当您的脚本与所有 3 个版本一起使用时,输出看起来正确:/usr/libexec/java_home -v15 -&gt; /Library/Java/JavaVirtualMachines/adoptopenjdk-15.jdk/Contents/Home /usr/libexec/java_home -v13 -&gt; /Library/Java/JavaVirtualMachines/zulu-13.jdk/Contents/Home /usr/libexec/java_home -v11 -&gt; /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
  • 对,所以只要我将/usr/libexec/java_home -v## 的输出绑定到 JAVA_HOME 变量,它就再也不会改变了。我猜为什么我不能多次覆盖 JAVA_HOME?

标签: java bash macos path java-home


【解决方案1】:

我有一个 M1 mac,对我来说,错误肯定是 java_home 总是返回相同的值,而不是无法重新分配 shell 变量(即 JAVA_HOME)。

我有一个 M1 mac 并且我已经安装了 azul jvms:

$ /usr/libexec/java_home -V
    Matching Java Virtual Machines (3):
    11.0.9.1 (arm64) "Azul Systems, Inc." - "Zulu 11.43.1021" /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
    9.0.4.0.11 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
    1.8.0_275 (arm64) "Azul Systems, Inc." - "Zulu 8.50.0.1017" /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home

我总是得到这个 zulu-11:

$ /usr/libexec/java_home -v 1.8
/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home

并且仍然获得 zulu-11:

$ /usr/libexec/java_home -v9
/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home

我认为我可以通过过滤 stdout 来解决问题,而不是仅使用“-V”参数进行调用,但该调用的结果会转到 stderr。所以这里有一个可以选择 JDK 1.8 的版本(在 'awk' 之后指定版本):

$ export JAVA_HOME=`/usr/libexec/java_home -V  2>&1 >/dev/null | awk '/1.8/ {print $NF}'`

感谢这里的第一个答案:How can I pipe stderr, and not stdout? 在这里:Printing the last column of a line in a file

说了以上所有内容后,使用 zsh 时(也许我一次更改太多东西)似乎有点不稳定,因为输出略有不同,并且包括当前设置。我可以让它工作:

JAVA_HOME=`/usr/libexec/java_home -V 2> /dev/fd/1 | awk '/^\ \ \ \ 1.8/ {print $NF}'`; java -version"

但如果 JAVA_HOME 未设置或错误,所有赌注都将取消,因为 java_home 在这种情况下不会打印出列表。可能在 java_home 修复之前,我会在我的 .bash_profile/.zshrc 中坚持使用简单的别名:

alias j8="export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home; java -version"
alias j11="export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home; java -version"

而不是:

alias j11="export JAVA_HOME=`/usr/libexec/java_home -V 2> /dev/fd/1 | awk '/^\ \ \ \ 11/ {print $NF}'`; java -version"
alias j8="export JAVA_HOME=`/usr/libexec/java_home -V 2> /dev/fd/1 | awk '/^\ \ \ \ 1.8/ {print $NF}'`; java -version"

这将再次起作用,当 java_home 工作时,但 TBH,我很少更改 jdk 以至于它成为一个问题,当我这样做时......因为 azul 使用较短的目录名称,其中不包括补丁版本号...我希望它会好起来的。当我走到那里时,我会越过那座桥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2018-07-23
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2021-12-27
    相关资源
    最近更新 更多