如何在 Mac OSX 上安装 Java 允许版本切换?

How do I install Java on Mac OSX allowing version switching?

我想在 Mac OSX 上安装 OpenJDK Java 并让它与其他 JDK 一起工作,因为它是一个较新的版本.目前,我下载了 tar.gz 并将其放在我的路径中,但这很难维护。

我发现唯一可以自动执行更多操作的其他安装是通过 Homebrew cask 安装。看起来也只有当前版本:

brew cask info java

显示:

java: 13,33:5b8a42f3905b406298b72d750b6919f6
https://openjdk.java.net/

所以我可以从那里安装它,但是然后呢?我是否只坚持使用新版本?

注意: 这些解决方案适用于 Java 的各种版本,包括 Java 8 到 Java 18( LTS 版本)。这包括来自 OpenJDK、Oracle、IBM、Azul、Amazon Correto、Graal 等的替代 JDK。轻松使用 Java 7、Java 8、Java 9、Java 10、Java 11、Java 12、Java 13、Java14、Java15、Java16、Java17、甚至Java18!

对于如何进行安装和管理 JDK 切换,您有几个选项。安装可以通过 Homebrew,SDKMAN, asdf, Jabba, or a manual install. Switching can be done by JEnv, SDKMAN, asdf, Jabba 或通过设置 JAVA_HOME 手动完成。所有这些都在下面描述。


TL;DR - 首选安装方法

您可以使用您喜欢的任何方法安装 Java,包括 SDKMAN、asdf、Homebrew 或手动安装 tar.gz 文件。手动安装的优点是 JDK 的位置可以放在 Mac OSX.

的标准化位置

然而,还有更简单的选项,例如 SDKMANasdf 也将为 JVM 安装其他重要和常用的工具。此处描述了这两个主要选项。

使用 SDKMAN 安装和切换版本

SDKMAN 有点不同,它处理安装和切换。 SDKMAN 还将已安装的 JDK 放入其自己的目录树中,通常为 ~/.sdkman/candidates/java。 SDKMAN 允许设置全局默认版本,以及特定于当前的版本 shell.

  1. https://sdkman.io/install

    安装 SDKMAN
  2. 列出可用的 Java 版本以确保您知道版本 ID

    sdk list java
    
  3. 安装其中一个版本,例如,Java 17 LTS:

    sdk install java 17-open 
    

    或java18:

    sdk install java 18-open
    
  4. 使Java 17成为默认版本:

    sdk default java 17-open
    

    或者为当前终端会话切换到 17:

    sdk use java 17-open
    

当您使用 list 命令列出可供安装的版本时,您将看到 Java:

的各种发行版
sdk list java

并安装其他版本,例如来自亚马逊的 JDK 11:

sdk install java 11.0.14.10.1-amzn

SDKMAN 可以与以前安装的现有版本一起使用。只需进行本地安装,提供您自己的版本标签和 JDK:

的位置
sdk install java my-local-13 /Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home

自由使用:

sdk use java my-local-13

SDKMAN 会在您更改版本时自动为您管理 PATHJAVA_HOME。请注意,它将 Java 版本安装到 ~/.sdkman/candidates/java/.

更多信息可在 SDKMAN Usage Guide along with other SDK's 它可以安装和管理。


使用“asdf”安装和切换版本

asdf is a version manager that supports installing and managing most languages, frameworks, and developer/devops tools. It has language specific plugins including one for Java.

  1. 首先,通过 https://asdf-vm.com/guide/getting-started.html 安装 asdf(阅读此处以正确设置 shell),或者更简单:

    brew reinstall asdf
    

    read the doc 用于正确设置你的 shell,但是如果你使用来自 Homebrew 的 asdf 和 ZSH,你可以执行这个命令来完成设置:

    echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
    
  2. 然后通过https://github.com/halcyon/asdf-java

    安装Java插件
    asdf plugin add java
    

    read the doc 用于在继续之前正确设置 shell。基本上它说要将以下内容添加到您的 ~/.zshrc 文件中(假设您没有使用另一个 shell):

    . ~/.asdf/plugins/java/set-java-home.zsh
    
  3. 现在列出 Java 个版本:

    asdf list-all java
    
  4. 安装您喜欢的风格和版本:

    asdf install java openjdk-17
    

    或安装最新的:

    asdf install java latest
    

其他重要的命令是...

  • 列出您安装的版本:

    asdf list java
    
  • 设置全局Java版本:

    asdf global java openjdk-17
    
  • 为目录设置本地 Java 版本:

    asdf local java openjdk-17
    

就这么简单! asdf 将在您更改版本时自动管理您的 PATH 和 JAVA_HOME。请注意,asdf 将 Java 版本安装到 ~/.asdf/installs/java

asdf 的其他语言和插件来自存储库页面:https://github.com/asdf-vm/asdf-plugins


其他安装方法

使用 Homebrew 安装

2018 年 10 月 3 日之前 Homebrew Cask 中可用的 Java 版本确实是 Oracle JVM。不过现在已经更新为OpenJDK。请务必更新 Homebrew,然后您将看到可供安装的最新版本。

  1. install Homebrew 如果您还没有。确保它已更新:

     brew update
    
  2. 添加木桶水龙头:

     brew tap homebrew/cask-versions
    

    这些 casks 经常更改其 Java 版本,并且可能还有其他水龙头有额外的 Java 版本。

  3. 寻找可安装的版本:

     brew search java  
    

    或者对于 Eclipse Temurin 版本:

     brew search temurin     
    
  4. 查看将要安装的版本的详细信息:

     brew info java
    

    或铁木林版本:

     brew info temurin
    
  5. 安装特定版本的 JDK,例如 java11temurin8temurin11temurin17,或者只是 javatemurin 表示该发行版的最新版本。例如:

     brew install java
    
     brew install --cask temurin
    

这些将安装到 /Library/Java/JavaVirtualMachines/,这是 Mac OSX 上预期的传统位置。在安装过程结束时,可能需要执行其他步骤才能使 JDK 处于活动状态。

从打开JDK 下载页面手动安装:

如果您需要 Java 的任何版本,这是一个不错的地方。

  1. http://jdk.java.net/ (for example Java 17 and Java 18)

    下载 Mac OSX 的 OpenJDK
  2. 解压 OpenJDK tar,并将生成的文件夹(即 jdk-17.jdk)放入您的 /Library/Java/JavaVirtualMachines/ 文件夹,因为这是标准文件夹以及 JDK 安装的预期位置。现实中也可以任意安装。

  3. JAVA_HOME 环境变量设置为指向您取消归档 JDK 的方向。

有关详细信息,请参阅答案 。有关如何管理多个手动安装的详细信息,另请参阅下面的“手动切换版本”部分。

其他安装选项:

OpenJDK 的其他一些风格是:

Azul Systems Java Zulu certified builds of OpenJDK can be installed by following the instructions on their site.

Zulu® is a certified build of OpenJDK that is fully compliant with the Java SE standard. Zulu is 100% open source and freely downloadable. Now Java developers, system administrators, and end-users can enjoy the full benefits of open source Java with deployment flexibility and control over upgrade timing.

Amazon Correto OpenJDK builds 有一个易于使用的安装包 Java 8, Java 11, Java 15, Java 16、Java 17 和 Java 18。它安装到 Mac OSX.

上的标准 /Library/Java/JavaVirtualMachines/ 目录

Amazon Corretto is a no-cost, multiplatform, production-ready distribution of the Open Java Development Kit (OpenJDK). Corretto comes with long-term support that will include performance enhancements and security fixes. Amazon runs Corretto internally on thousands of production services and Corretto is certified as compatible with the Java SE standard. With Corretto, you can develop and run Java applications on popular operating systems, including Linux, Windows, and macOS.


我的JDK在哪里?!?!

要查找以前安装的 Java JDK 在默认系统位置的安装位置,请使用:

/usr/libexec/java_home -V

Matching Java Virtual Machines (10):
17 (x86_64) "Homebrew" - "OpenJDK 17" /usr/local/Cellar/openjdk/17/libexec/openjdk.jdk/Contents/Home
11, x86_64: "Java SE 11" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
1.8.301.09 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home /usr/local/Cellar/openjdk/17/libexec/openjdk.jdk/Contents/Home

您还可以使用 -v 仅报告特定 Java 版本的位置。例如 Java 17:

/usr/libexec/java_home -v 17

/usr/local/Cellar/openjdk/17/libexec/openjdk.jdk/Contents/Home

了解安装的 JDK 的位置在使用 JEnv 等工具、手动添加本地安装到 SDKMAN 或 link 系统 JDK 时也很有用在 Jabba -- 你需要知道在哪里可以找到它们。

如果您需要查找由其他工具安装的 JDK,请检查这些位置:

  • SDKMAN 安装到 ~/.sdkman/candidates/java/
  • asdf 安装到 ~/.asdf/installs/java
  • Jabba 安装到 ~/.jabba/jdk

版本切换

如果您正在使用 SDKMANasdf,那么您已经了解了,可以停止阅读了!否则,这里有一些选项可以切换现有的 VM 安装。

手动切换版本

Java 可执行文件是一个包装器,它将使用 JAVA_HOME 中配置的任何 JDK,因此您可以更改它以更改正在使用的 JDK .

例如,如果您安装或取消tar'd JDK 16 到 /Library/Java/JavaVirtualMachines/jdk-16.jdk 如果它是最高版本号,它应该已经是默认版本,否则您可以只需设置:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home

现在路径中的任何 Java 可执行文件都会看到此信息并使用正确的 JDK。

一个simple way to change JDKs是在你的~/.bashrc~/.zshrc文件中创建一个函数:

jdk() {
    version=
    export JAVA_HOME=$(/usr/libexec/java_home -v"$version");
    java -version
}

然后简单地改变JDKs:

jdk 1.8
jdk 9
jdk 11
jdk 13

使用 JEnv 切换版本

JEnv 期望 Java JDK 已经存在于机器上并且可以在任何位置。通常,您会在 /Library/Java/JavaVirtualMachines/ 中找到已安装的 Java JDK。 JEnv 允许设置 Java 的全局版本,一个用于当前 shell,以及一个每个目录的本地版本,这在某些项目需要与其他项目不同的版本时很方便。

  1. 如果您还没有安装 JEnv,请按照网站上的说明 http://www.jenv.be/ 手动安装或使用 Homebrew。

  2. 将任何 Java 版本添加到 JEnv(调整目录,如果你把它放在别处):

    jenv add /usr/local/Cellar/openjdk/17/libexec/openjdk.jdk/Contents/Home
    
  3. 使用此命令设置您的全球版本:

    jenv global 17
    

您还可以使用 jenv add 以类似方式添加其他现有版本,并列出可用的版本。例如 Java 8:

jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home 
jenv versions

有关更多命令,请参阅 JEnv docs。您现在可以随时在整个系统、shell 或每个本地目录的任何 Java 版本(Oracle、OpenJDK、其他)之间切换。

为了在使用 JEnv 时帮助管理 JAVA_HOME,您可以添加 export plugin 来为您执行此操作。

$ jenv enable-plugin export
  You may restart your session to activate jenv export plugin echo export plugin activated

导出插件可能不会调整 JAVA_HOME 如果它已经设置,所以你可能需要在你的配置文件中清除这个变量,以便它可以被 JEnv 管理。

您还可以使用 jenv exec <command> <parms...> 到 运行 单个命令,并为该命令正确设置 JAVA_HOMEPATH,这可能包括打开另一个 shell.


使用 Jabba 安装和切换版本

Jabba 还处理安装和切换。 Jabba 还将已安装的 JDK 放入其自己的目录树中,通常为 ~/.jabba/jdk.

  1. 按照 instructions on the home page.

    安装 Jabba
  2. 列表可用JDK的

    jabba ls-remote
    
  3. 安装JavaJDK12

    jabba install openjdk@1.12.0
    
  4. 使用它:

    jabba use openjdk@1.12.0
    

您还可以将版本名称 link 别名到现有的 JDK 已经安装,并找到有趣的 JDK 的组合,例如 GraalVM,采用 JDK、IBM JDK 等。主页上也提供了完整的 usage guide

Jabba 会在您更改版本时自动管理您的 PATHJAVA_HOME

另一种选择是使用 SDKMAN! See https://wimdeblauwe.wordpress.com/2018/09/26/switching-between-jdk-8-and-11-using-sdkman/

首先安装SDKMAN:https://sdkman.io/install然后...

  1. 安装 Oracle JDK 8:sdk install java 8.0.181-oracle
  2. 安装 OpenJDK 11:sdk install java 11.0.0-open

切换:

  • 切换到 JDK 8 sdk use java 8.0.181-oracle
  • 切换到 JDK 11 和 sdk use java 11.0.0-open

要设置默认值:

  • 默认为 JDK 8 和 sdk default java 8.0.181-oracle
  • 默认为 JDK 11 和 sdk default java 11.0.0-open

恕我直言,不需要安装所有额外的 applications/packages。

使用命令检查可用版本:

> /usr/libexec/java_home -V
Matching Java Virtual Machines (8):
    11, x86_64: "Java SE 11-ea" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
    10.0.2, x86_64: "Java SE 10.0.2"    /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
    9.0.1, x86_64:  "Java SE 9.0.1" /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home
    1.8.0_181-zulu-8.31.0.1, x86_64:    "Zulu 8"    /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home
    1.8.0_151, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home
    1.7.0_80, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
    1.6.0_65-b14-468, x86_64:   "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-468, i386: "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

现在,如果您想在上面的列表中选择 Azul JDK 8,而不是 Oracle 的 Java SE 8,请调用以下命令:

> /usr/libexec/java_home -v 1.8.0_181
/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home

要选择 Oracle 的 Java SE 8,您需要调用命令:

> /usr/libexec/java_home -v 1.8.0_151
/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home

如您所见,提供的版本号应该是一组唯一的字符串:1.8.0_181 vs 1.8.0_151

不用第三方工具手动切换系统默认版本:

this older answer 中所详述,在 macOS 上 /usr/bin/java 是一个包装器工具,它将使用 JAVA_HOME 指向的 Java 版本,或者如果未设置该变量,它将看起来对于 /Library/Java/JavaVirtualMachines/ 下的 Java 个安装,将使用最高版本。它通过查看每个包下的 Contents/Info.plist 来确定版本。

有了这些知识,您可以:

  • 通过在您不想用作默认版本的版本中重命名 Info.plist 来控制系统将使用哪个版本(实际 Java 运行时本身不使用该文件)。
  • 通过设置 $JAVA_HOME
  • 控制用于特定任务的版本

我刚刚验证了 OpenJDK 和 Mojave 仍然如此。

在全新的系统上,没有安装Java版本:

$ java -version
No Java runtime present, requesting install.

取消此操作,在 https://jdk.java.net 上下载 OpenJDK 11 和 12ea; 安装 OpenJDK11:

$ cd /Library/Java/JavaVirtualMachines/
$ sudo tar xzf ~/Downloads/openjdk-11.0.1_osx-x64_bin.tar.gz

系统 java 现在是 11:

$ java -version
openjdk version "11.0.1" 2018-10-16
[...]

安装 OpenJDK12(目前抢先体验):

$ sudo tar xzf ~/Downloads/openjdk-12-ea+17_osx-x64_bin.tar.gz 

系统 java 现在是 12:

$ java -version
openjdk version "12-ea" 2019-03-19
[...]

现在让我们 "hide" 来自系统 java 包装器的 OpenJDK 12:

$ cd jdk-12.jdk/Contents/
$ sudo mv Info.plist Info.plist.disabled

系统java回到11:

$ java -version
openjdk version "11.0.1" 2018-10-16
[...]

并且您仍然可以通过手动设置JAVA_HOME:

准时使用版本12
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home
$ java -version
openjdk version "12-ea" 2019-03-19
[...]

我就是这样做的。

步骤 1: 安装 Java11

您可以从这里为 mac 下载 Java 11 dmg:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html

第二步:安装完成后Java 11. 确认安装所有版本。在您的终端中输入以下命令。

/usr/libexec/java_home -V

步骤 3: 编辑 .bash_profile

sudo nano ~/.bash_profile

步骤 4: 添加 11.0.1 作为默认值。 (将下行添加到 bash_profile 文件)。

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

切换到任何版本

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

现在按 CTRL+X 退出 bash。按 'Y' 保存更改。

第 5 步: 重新加载 bash_profile

source ~/.bash_profile

第 6 步: 确认 Java

的当前版本
java -version

使用 Homebrew 和 jenv:

假设:Mac 机器并且您已经安装了自制软件。

从 Oracle 官方网站安装 Java。您可以安装 JDK 的多个版本。它将安装在以下路径:

 /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/
 /Library/Java/JavaVirtualMachines/jdk1.11.0_2.jdk/
 /Library/Java/JavaVirtualMachines/jdk-14.0.2.jdk/

没有jenv,系统将使用最后安装的java。

如果你想use/manage多个版本那么你可以使用jenv:

安装并配置 jenv:

$ brew install jenv
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(jenv init -)"' >> ~/.zshrc
$ source ~/.zshrc

将安装的java添加到jenv:

$ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
$ jenv add /Library/Java/JavaVirtualMachines/14.0.2.jdk/Contents/Home

查看所有已安装的java:

$ jenv versions

以上命令将给出已安装的列表 java:

  system
  1.8
* 1.8.0.291 (set by /Users/lpatel/.jenv/version)
  14
  14.0
  14.0.2
  oracle64-1.8.0.291
  oracle64-14.0.2

配置您要使用的 java 版本:

$ jenv global 1.8.0.291

如果您的计算机上安装了多个版本,请在 bash 配置文件中添加以下内容:

export JAVA_HOME_7=$(/usr/libexec/java_home -v1.7)

export JAVA_HOME_8=$(/usr/libexec/java_home -v1.8)

export JAVA_HOME_9=$(/usr/libexec/java_home -v9)

并添加以下别名:

alias java7='export JAVA_HOME=$JAVA_HOME_7'

alias java8='export JAVA_HOME=$JAVA_HOME_8'

alias java9='export JAVA_HOME=$JAVA_HOME_9'

并且可以使用别名切换到所需的版本:

在终端中:

~ >> java7 export JAVA_HOME=$JAVA_7_HOME

要继续使用特定的主要版本,请使用 brew tap 激活 AdoptOpenJDK tap,然后使用 brew cask install 安装所需的版本:

$ brew tap AdoptOpenJDK/openjdk
$ brew cask install <version>

要使用 HotSpot 安装 AdoptOpenJDK 14,运行:

$ brew tap AdoptOpenJDK/openjdk
$ brew cask install adoptopenjdk14

您可以使用asdf安装并在多个java版本之间切换。它也有其他语言的插件。你可以用 Homebrew 安装 asdf

brew install asdf

配置asdf后,安装java插件

asdf plugin-add java

选择要安装的版本

asdf list-all java

例如安装配置adoptopenjdk8

asdf install java adoptopenjdk-8.0.272+10
asdf global java adoptopenjdk-8.0.272+10

最后,如果需要,为您的 shell 配置 JAVA_HOME。只需添加到您的 shell 初始化脚本,例如 ~/.zshrc 在 zsh 的情况下:

. ~/.asdf/plugins/java/set-java-home.zsh

此答案扩展了 Jayson 的出色答案,并针对您的用例的最佳方法提供了一些更有见地的指导:

  • SDKMAN 是大多数用户的最佳解决方案。它易于使用,没有任何奇怪的配置,并且还可以轻松管理 lots of other Java ecosystem 项目的多个版本。
  • 通过 Homebrew 下载 Java 版本并通过 jenv 切换版本是一个不错的选择,但需要更多工作。例如,the Homebrew commands in this highly upvoted answer don't work anymore. jenv is slightly harder to setup, the plugins 没有很好的记录,自述文件说该项目正在寻找新的维护者。 jenv 仍然是一个伟大的项目,解决了这个问题,社区应该感谢所做的出色贡献。 SDKMAN 是更好的选择,因为它太棒了。
  • Jabba 是一个 multi-platform 解决方案,它在 Mac、Windows 和 PC 上提供相同的界面(它是用 Go 编写的,这就是它允许多平台的原因) .如果您关心多平台解决方案,这是一个巨大的卖点。如果您只关心 Mac 上的 运行 多个版本,那么您不需要多平台解决方案。如果您使用 Jabba,SDKMAN 对数十种流行 SDK 的支持是您所错过的。

手动管理版本可能是最糟糕的选择。如果您决定手动切换版本,您可以使用此 Bash 代码而不是 Jayson 的冗长代码(代码片段来自 homebrew-openjdk README:

jdk() {
        version=
        export JAVA_HOME=$(/usr/libexec/java_home -v"$version");
        java -version
 }

Jayson 的回答提供了SDKMAN 和jenv 的基本命令。如果您想了解这些工具的更多背景信息,请参阅 SDKMAN and more info on jenv 的更多信息。

您可以按任何方式安装 JDK 版本。

  • 自制软件
  • SDK人
  • 手动

然后,我推荐使用JENV在不同版本之间切换,并在全局或本地使用您需要的JDK。

您可以在此处找到有关如何安装和使用 JENV 的更多详细信息 -> https://blog.adamgamboa.dev/2021/06/17/using-jenv-to-switch-jkd-versions/