在 macOS BigSur 中更改 Java 版本

leo*_*s79 11 java macos java-home java-8

我无法在 macOS BigSur 中更改 java 版本。我有以下版本:

当我执行此命令时

/usr/libexec/java_home -V
Run Code Online (Sandbox Code Playgroud)

我有以下版本:

Matching Java Virtual Machines (3):
    11.0.8 (x86_64) "Oracle Corporation" - "Java SE 11.0.8" /Library/Java/JavaVirtualMachines/jdk-11.0.8.jdk/Contents/Home
    1.8.261.12 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
    1.8.0_261 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-11.0.8.jdk/Contents/Home
Run Code Online (Sandbox Code Playgroud)

我想切换到 java 1.8 作为默认版本,所以我执行以下命令:

export JAVA_HOME=/usr/libexec/java_home -v 1.8.0_261
Run Code Online (Sandbox Code Playgroud)

然后当我检查 java 版本时:

java -version
Run Code Online (Sandbox Code Playgroud)

我仍然得到旧的(更高的)

java version "11.0.8" 2020-07-14 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.8+10-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.8+10-LTS, mixed mode)
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用?

小智 8

请使用以下命令:-

export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_261`
Run Code Online (Sandbox Code Playgroud)

  • @leonidas79 运行该命令后,然后运行 ​​`set | grep JAVA`它向你显示了什么? (2认同)
  • 反引号的目的意味着命令运行,然后将其输出放入变量“JAVA_HOME”中。 (2认同)

Zai*_*acu 8

现在有新的二进制文件,/usr/bin/java并且它的优先级高于$JAVA_HOME/bin/java

  • 修正:`export PATH=$JAVA_HOME/bin:$PATH`,从`/usr/bin/java`前面的JAVA_HOME生成二进制文件 (4认同)
  • 该 PATH 可以导出到 `~/.bash_profile` 或其他 shell 配置文件中,例如。`~/.zshrc` 用于 zShell。您可能需要执行“source ~/.bash_profile”,或者之后打开新的终端窗口 (2认同)

小智 5

今天将 macOS 升级到 Big Sur 后,我对同样的问题感到困惑。

我的 Mac 上有两个 JDK:Oracle JDK 11 和 Oracle JDK 8。

然后/usr/libexec/java_home总是返回/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home并忽略其他参数,例如-v 1.8

经过一些测试,我发现只有当您的 Mac 具有 Oracle JDK 1.8.X 版本时才会发生这种情况。

所以我删除了Oracle JDK 1.8.x,/usr/libexec/java_home可以返回正确的JDK 11路径。

然后我尝试了AdoptOpenJDK 8,/usr/libexec/java_home可以正确返回其路径,但忽略-v 11arg,无法获取JDK 11的路径。

似乎java_home命令中存在一些错误,如果您的 Mac 上只有一个 JDK(Oracle JDK 8 除外),它应该可以正常工作。如果您有多个 JDK,它可能只返回最后安装的 JDK 路径。

所以要么只保留一个JDK安装,要么设置$JAVA_HOMEenv为绝对路径就可以了。


glo*_*dor 5

您必须取消设置 JAVA_HOME 并设置 JAVA_VERSION 然后它才能工作。

~% JAVA_VERSION=12 java -version
openjdk version "14.0.2" 2020-07-14
~% export JAVA_VERSION=12
~% java -version
openjdk version "14.0.2" 2020-07-14
~% unset JAVA_HOME
~% java -version
java version "12.0.1" 2019-04-16
~% JAVA_VERSION=13 java -version
java version "13-ea" 2019-09-17
Run Code Online (Sandbox Code Playgroud)

或者如果你需要设置 JAVA_HOME 你需要在调用之前取消设置 /usr/libexec/java_home

function jav {
unset JAVA_HOME
export JAVA_HOME=`/usr/libexec/java_home -v $@`
}
~% jav 12
~% java -version
java version "12.0.1" 2019-04-16
~% jav 13
~% java -version
java version "13-ea" 2019-09-17
Run Code Online (Sandbox Code Playgroud)


mar*_*571 5

我在我的 .zshenv 上添加了以下内容,并且工作正常。谢谢穆南。

## Java home 
export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_11_HOME=$(/usr/libexec/java_home -v11)
export JAVA_17_HOME=$(/usr/libexec/java_home -v17)

## Java alias
alias java8="export JAVA_HOME=$JAVA_8_HOME"
alias java11="export JAVA_HOME=$JAVA_11_HOME"
alias java17="export JAVA_HOME=$JAVA_17_HOME"
alias jv='java -version'

## Default Java
java11
Run Code Online (Sandbox Code Playgroud)

要从控制台更改 java 版本,请使用:java8、java11 或 java17