如何在macOS上设置或更改默认的Java(JDK)版本?

1332

如何在Mac上更改Java的默认版本?


4
执行/usr/libexec/java_home命令会告诉你什么? - Bart
2
/usr/libexec/java_home 返回 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home - Venkat
也许你只需要重新启动一下。你试过了吗? - Bart
1
是的,我重启了电脑和终端……但没有改变。 - Venkat
9
您能否接受下面由@markhellewell高票获得的答案呢?这会帮助我更快地找到它,而且也很友好。 :) - Taytay
显示剩余2条评论
37个回答

7

以下内容来自苹果公司官方java_home(1)手册页

**USAGE**

   /usr/libexec/java_home  helps  users  set a $JAVA_HOME in their login rc files, or provides a way for
   command-line Java tools to use the most appropriate JVM which can satisfy a minimum version or archi-
   tecture  requirement.  The --exec argument can invoke tools in the selected $JAVA_HOME/bin directory,
   which is useful for starting Java command-line tools from launchd plists without hardcoding the  full
   path to the Java command-line tool.

   Usage for bash-style shells:
          $ export JAVA_HOME=`/usr/libexec/java_home`

   Usage for csh-style shells:
          % setenv JAVA_HOME `/usr/libexec/java_home`

7

运行

/usr/libexec/java_home -V

你将获得你拥有的所有Java版本。
示例:
Matching Java Virtual Machines (3):
    17.0.7 (x86_64) "Amazon.com Inc." - "Amazon Corretto 17" /Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home
    11.0.19 (x86_64) "Amazon.com Inc." - "Amazon Corretto 11" /Users/abhishek.khaiwale/Library/Java/JavaVirtualMachines/corretto-11.0.19/Contents/Home
    11.0.19 (x86_64) "Amazon.com Inc." - "Amazon Corretto 11" /Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home

如果您需要Java版本11.0.19,请执行。
export JAVA_HOME=`/usr/libexec/java_home -v 11.0.19`

这已经在其他答案中至少提到过一次。 - Eric Aya
@Eric Aya,这个答案包含了太多细节,在紧急情况下浪费时间。 - Abhishek Khaiwale

6

首先找出你存储环境变量的位置:

  1. emacs
  2. bash_profile
  3. zshrc文件

设置环境变量的步骤如下:

  1. 从JAVA下载JDK。

  2. 双击安装。

  3. 现在在你的文件中设置环境变量。

    a. 对于emacs.profile,您可以使用此链接或查看下面的截图。

enter image description here

b. 对于ZSH配置文件设置 -

1. export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home

2. source ~/.zshrc - Restart zshrc to reflect the changes.

3. echo $JAVA_HOME - make sure path is set up properly 
   ----> /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home

4. java -version 

   -->  java version "1.8.0_112"  Java(TM) SE Runtime Environment (build 1.8.0_112-b16)Java HotSpot(TM) 64-Bit Server VM (build 25.112-b16, mixed mode)

现在已经准备好了,您可以轻松地升级或降级JAVA版本。


6

如果您仍然无法设置它,可以使用以下命令:

export JAVA_HOME=/usr/libexec/java_home -v 1.8

然后您需要使用以下命令:

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

这样一定会起作用。


6

以前我在 .zshrc 中使用别名来方便地切换版本,但今天我使用 SDKMAN 。 SDKMAN 还可以处理设置系统默认 java ,下载和安装新的 java 版本。

一旦安装了 sdkman ,您就可以执行类似于 nvm 工具处理 node 版本的命令。

sdk list java 将列出系统中可用的 java 版本以及可在线安装的版本,包括您可以在 sdk use, sdk defaultsdk install 命令中使用的标识符。

例如,要安装 Amazon Corretto 11.0.8 并询问是否应该成为新的默认值,请执行以下操作: sdk install java 11.0.8-amzn

我经常使用的一个功能是 .sdkmanrc 文件。 如果将其放置在计算机上的某个目录中并在该目录中运行 sdk env 命令,则可以配置仅在该目录中使用的工具版本。还可以使用 sdkman_auto_env=true 配置使 sdkman 自动切换工具版本。

sdkman 还支持处理 JVM 的其他工具,如 gradle、kotlin、maven 等。

有关更多信息,请查看https://sdkman.io/usage#env


6

无需安装其他工具,将分别安装的JDK识别为/usr/libexec/java_home -V的一级成员的简单方法是创建符号链接,操作如下:

sudo ln -s <path> /Library/Java/JavaVirtualMachines/jdk-[some-identifier].jdk

<path>预计是一个包含子目录Contents/Home/bin等的目录。


常见用例是注册Android Studio附带的JDK/JRE:

在最近版本的macOS Android Studio中,Java工具的默认位置是/Applications/Android\ Studio.app/Contents/jre。我们将使用jdk-android-studio.jdk作为标识符:

sudo ln -s /Applications/Android\ Studio.app/Contents/jre /Library/Java/JavaVirtualMachines/jdk-android-studio.jdk

现在,/usr/libexec/java_home -V 将会在 匹配的Java虚拟机 中列出它:
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
    11.0.13 (arm64) "JetBrains s.r.o." - "OpenJDK 11.0.13" /Applications/Android Studio.app/Contents/jre/Contents/Home
/Applications/Android Studio.app/Contents/jre/Contents/Home

1
这帮助我在一秒钟内解决了KMM中的问题“项目Command PhaseScriptExecution失败,出现非零退出码” - micdev

4
如果你正在使用 macOS 系统和 fish 终端,并且想要在不同版本的JDK之间切换,可以尝试以下方法。在我的电脑上测试有效。
@kenglxn的回答对我无效,后来发现是因为没有设置 -g(全局)选项!
将下面的内容添加到 ~/.config/fish/config.fish 文件中即可:
alias j8="jhome  -v 1.8.0_162"
alias j9="jhome  -v 9.0.1"

function jhome
    set -g -x JAVA_HOME (/usr/libexec/java_home $argv)
    echo "JAVA_HOME:" $JAVA_HOME
    echo "java -version:"
    java -version
end

funcsave jhome

要知道您安装的是哪个版本/次要版本,可以执行以下操作:

/usr/libexec/java_home -V                                                                              579ms  Wed 14 Feb 11:44:01 2018
Matching Java Virtual Machines (3):
    9.0.1, x86_64:  "Java SE 9.0.1" /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home
    1.8.0_162, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home
    1.8.0_121, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home

4

本文将指导您如何在MacOS设备上切换JAVA版本。这对于使用不支持更新的JAVA版本的应用程序非常有用。例如,像Cassandra这样的应用程序只能与JAVA 8版本一起使用。

首先,您需要确保已安装多个JAVA版本。

打开新的终端窗口并输入:

/usr/libexec/java_home -V

你的输出应该看起来像这样:

Matching Java Virtual Machines (2):
11.0.1, x86_64: "Java SE 11.0.1" /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
1.8.0_201, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home

请注意,有两个可用的JDK。如果您没有注意到需要切换到的Java版本,请从此处下载并安装适当的版本(JDK 8表示为1.8)。安装完适当的JDK后,请重复此步骤。

  1. 记下您想要切换到的JDK版本。例如,在上面的示例中,“11.0”和“1.8”是可用的JDK版本。

  2. 切换到所需版本。例如,如果您想切换到JDK 8,则输入以下行:

    export JAVA_HOME=/usr/libexec/java_home -v 1.8

    对于11.0,将“1.8”替换为“11.0”

  3. 通过在终端中输入以下内容来检查您的JDK版本:

    java -version

如果您已正确执行所有步骤,则JDK版本应与您在最后一步指定的版本相对应。

  1. (可选)要将此设置为默认的JDK版本,请在终端中输入以下内容:

    open ~/.bash_profile

接着,将第三步的终端输入添加到此文件中:

切换至 Java 8 版本

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

保存并关闭文件。

完成。


3
如果您有多个版本并且您想使用特定版本运行某些内容,请使用以下示例:
/usr/libexec/java_home -v 1.7.0_75 --exec java -jar you-file.jar

2

这是我在我的Linux(Ubuntu / Mint mate)上的做法,我猜Mac可以类似地做。


安装和配置

步骤:

  • [基础 - 部分]
  • 手动下载jdk (.tgz文件)
  • 解压并正确重命名到适当位置。
    例如:/mnt/star/program/java/jdk-1.8
  • 建立软链接,稍后将更改以切换java版本。
    例如:ln -s /mnt/star/program/java/jdk-1.8 /mnt/star/program/java/java
    因此,/mnt/star/program/java/java是软链接。
  • 在启动脚本中设置JAVA_HOME
    可以使用像/etc/profile.d/eric.sh这样的文件,或者只使用~/.bashrc
    例如:JAVA_HOME=/mnt/star/program/java/java
  • 然后打开一个新的bash shell。java -version应该会打印出java版本。
  • [更多版本 - 部分]
  • 按需下载和安装更多的Java版本,如同上面的步骤。
    例如:
    /mnt/star/program/java/jdk-11
  • [切换 - 部分]
  • ~/.bashrc中定义各种Java版本的变量。
    例如:
    _E_JAVA_HOME_11='/mnt/star/program/java/jdk-11'
    _E_JAVA_HOME_8='/mnt/star/program/java/jdk-8'
    # 默认版本目录,
    _E_JAVA_HOME_D=$_E_JAVA_HOME_8
  • ~/.bashrc中,定义切换Java版本的命令。
    例如:
    ## 切换java版本,
    alias jv11="rm $JAVA_HOME; ln -s $_E_JAVA_HOME_11 $JAVA_HOME"
    alias jv8="rm $JAVA_HOME; ln -s $_E_JAVA_HOME_8 $JAVA_HOME"
    # 默认java版本,
    alias jvd="rm $JAVA_HOME; ln -s $_E_JAVA_HOME_D $JAVA_HOME"
    alias jv="java -version"
  • 在终端中,使用 source ~/.bashrc 命令使更改生效。
  • 然后可以使用定义好的命令进行版本切换。

从上面的配置中获得的命令

命令:

  • jv11
    切换到Java 11版本
  • jv8
    切换到Java 8版本
  • jvd
    切换到默认的Java版本,由上面定义的_E_JAVA_HOME_D表示。
  • jv
    显示java版本。
eric@eric-pc:~$ jv
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

eric@eric-pc:~$ jv11
eric@eric-pc:~$ jv
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)

eric@eric-pc:~$ jvd
eric@eric-pc:~$ jv
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

eric@eric-pc:~$ 

机制

  • 它通过更改软链接来进行切换,软链接用作JAVA_HOME

提示

  • 在我的机器上手动安装jdk时,我保留了次要版本号,然后使用主要版本但不包括次要版本创建了一个软链接。
    例如
    //这是实际的目录,
    jdk1.8.0_191

    //这是到jdk1.8.0_191的软链接
    jdk-8

    //这是到jdk-8jdk-11的软链接
    java

  • 我在~/.bashrc中定义命令别名,但在单独的文件中定义变量。
    我使用~/.eric_var来定义变量,并且~/.bashrc将对其进行源化(例如source $HOME/.eric_var)。


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