447

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

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

brew cask info java

显示:

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

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

4

11 回答 11

1071

注意: 这些解决方案适用于各种 Java 版本,包括 Java 8 到 Java 17(LTS 版本)。这包括来自 OpenJDK、Oracle、IBM、Azul、Amazon Correto、Graal 等的替代 JDK。轻松使用 Java 7、Java 8、Java 9、Java 10、Java 11、Java 12、Java 13、Java 14、Java 15、Java 16 和 Java 17!

对于如何进行安装以及管理 JDK 切换,您有几个选项。可以通过 Homebrew、SDKMANasdfJabba或手动安装来完成安装。可以通过JEnvSDKMANasdfJabba或通过设置手动进行切换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:

    sdk install java 17-open 
    
  4. 将 Java 17 设为默认版本:

    sdk default java 17-open
    

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

    sdk use java 17-open
    

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

sdk list java

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

sdk install java 11.0.10.9.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 使用指南以及它可以安装和管理的其他 SDK中提供了更多信息。


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

asdf是一个版本管理器,支持安装和管理大多数语言、框架和开发人员/devops 工具。它具有特定于语言的插件,包括一个用于 Java 的插件。

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

    brew reinstall asdf
    

    阅读文档以正确设置您的 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
    

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

    . ~/.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. 如果您还没有安装 Homebrew 。确保它已更新:

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

     brew tap homebrew/cask-versions
    

    这些木桶经常更改它们的 Java 版本,并且可能还有其他带有其他 Java 版本的水龙头。

  3. 寻找可安装的版本:

     brew search java  
    

    或者对于 Eclipse Temurin 版本:

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

     brew info java
    

    或者对于 Temurin 版本:

     brew info temurin
    
  5. 安装特定版本的 JDK,例如java11temurin8temurin11或仅安装该发行版javatemurin最新版本。例如:

     brew install java
    
     brew install --cask temurin
    

这些将安装/Library/Java/JavaVirtualMachines/在 Mac OSX 上预期的传统位置。在安装过程结束时可能会报告其他步骤以使 JDK 处于活动状态。

从 OpenJDK 下载页面手动安装:

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

  1. 从http://jdk.java.net/下载适用于 Mac OSX 的 OpenJDK (例如Java 17

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

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

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

其他安装选项:

OpenJDK 的其他一些风格是:

Azul Systems Java Zulu认证的 OpenJDK 版本可以按照其网站上的说明进行安装。

Zulu® 是经过认证的 OpenJDK 版本,完全符合 Java SE 标准。Zulu 是 100% 开源且可免费下载的。现在,Java 开发人员、系统管理员和最终用户可以享受开源 Java 的全部优势,并具有部署灵活性和对升级时间的控制。

Amazon Correto OpenJDK 构建有一个易于使用的 Java 8、Java 11、Java 15、Java 16 和 Java 17 安装包。它安装到/Library/Java/JavaVirtualMachines/Mac OSX 上的标准目录。

Amazon Corretto 是开放式 Java 开发工具包 (OpenJDK) 的免费、多平台、生产就绪发行版。Corretto 提供长期支持,包括性能增强和安全修复。亚马逊内部在数千个生产服务上运行 Corretto,并且 Corretto 被认证为与 Java SE 标准兼容。使用 Corretto,您可以在流行的操作系统(包括 Linux、Windows 和 macOS)上开发和运行 Java 应用程序。


我的JDK在哪里?!?!

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

/usr/libexec/java_home -V

匹配 Java 虚拟机 (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

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

/usr/libexec/java_home -v 17

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

在使用 JEnv 之类的工具,或手动将本地安装添加到 SDKMAN,或在 Jabba 中链接系统 JDK 时,了解已安装 JDK 的位置也很有用——而且您需要知道在哪里可以找到它们。

如果您需要查找其他工具安装的 JDK,请检​​查以下位置:

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

版本切换

如果您使用的是SDKMANasdf,您已经被覆盖并且可以停止阅读!否则,这里有一些用于切换现有 VM 安装的选项。

手动切换版本

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

例如,如果您安装或解压 JDK 16,/Library/Java/JavaVirtualMachines/jdk-16.jdk如果它是最高版本号,它应该已经是默认值,如果不是,您可以简单地设置:

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

现在,路径中的任何 Java 可执行文件都将看到这一点并使用正确的 JDK。

更改 JDK的一种简单方法是在您的~/.bashrcor~/.zshrc文件中创建一个函数:

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

然后只需通过以下方式更改 JDK:

jdk 1.8
jdk 9
jdk 11
jdk 13

使用 JEnv 切换版本

JEnv期望 Java JDK 已经存在于机器上并且可以在任何位置。通常,您会在/Library/Java/JavaVirtualMachines/. 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 文档。您现在可以随时为整个系统、shell 或每个本地目录在任何 Java 版本(Oracle、OpenJDK 等)之间切换。

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

$ 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. 按照主页上的说明安装 Jabba 。

  2. 列出可用的 JDK

    jabba ls-remote
    
  3. 安装 Java JDK 12

    jabba install openjdk@1.12.0
    
  4. 用它:

    jabba use openjdk@1.12.0
    

您还可以为版本名称设置别名,链接到已安装的现有 JDK,并找到有趣的 JDK 组合,例如 GraalVM、Adopt JDK、IBM JDK 等。完整的使用指南也可以在主页上找到。

当您更改版本时, Jabba 将自动管理您的PATHJAVA_HOME为您服务。

于 2018-09-26T18:32:30.713 回答
28

我就是这样做的。

第 1 步: 安装 Java 11

您可以从此处下载适用于 mac 的 Java 11 dmg:https ://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html

第 2 步:安装 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
于 2018-11-13T03:11:10.537 回答
14

使用 Homebrew 和 jenv:

假设:Mac 机器并且你已经安装了 homebrew。

从 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。

如果您想使用/管理多个版本,那么您可以使用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
于 2019-10-20T15:34:47.380 回答
12

在没有第三方工具的情况下手动切换系统默认版本:

正如这个较早的答案中所详述的,在 macOS 上/usr/bin/java是一个包装工具,它将使用指向的 Java 版本,JAVA_HOME或者如果未设置该变量,将在下查找 Java 安装/Library/Java/JavaVirtualMachines/并将使用最高版本的安装。它通过查看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
[...]

现在让我们从系统 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
[...]

您仍然可以通过手动设置准时使用版本 12 JAVA_HOME

$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home
$ java -version
openjdk version "12-ea" 2019-03-19
[...]
于 2018-10-28T11:49:55.640 回答
8

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

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

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

导出 JAVA_HOME_9=$(/usr/libexec/java_home -v9)

并添加以下别名:

别名 java7='导出 JAVA_HOME=$JAVA_HOME_7'

别名 java8='导出 JAVA_HOME=$JAVA_HOME_8'

别名 java9='导出 JAVA_HOME=$JAVA_HOME_9'

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

在终端:

~ >> java7 export JAVA_HOME=$JAVA_7_HOME

于 2019-10-20T15:48:37.047 回答
4

另一种选择是使用SDKMAN!见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 8sdk use java 8.0.181-oracle
  • 切换到 JDK 11sdk use java 11.0.0-open

要设置默认值:

  • 默认为 JDK 8sdk default java 8.0.181-oracle
  • 默认为 JDK 11sdk default java 11.0.0-open
于 2018-09-26T19:17:08.113 回答
3

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

brew install asdf

配置 asdf 后,安装 java 插件

asdf plugin-add java

选择要安装的版本

asdf list-all java

例如安装和配置采用openjdk8

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

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

. ~/.asdf/plugins/java/set-java-home.zsh
于 2020-10-26T21:52:08.230 回答
1

恕我直言,无需安装所有其他应用程序/软件包。

使用以下命令检查可用版本:

> /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

于 2018-10-05T10:18:52.650 回答
1

这个答案扩展了杰森的优秀答案,并就您的用例的最佳方法提供了一些更有主见的指导:

  • SDKMAN 是大多数用户的最佳解决方案。它易于使用,没有任何奇怪的配置,并且还可以轻松管理许多其他 Java 生态系统项目的多个版本。
  • 通过 Homebrew 下载 Java 版本并通过 jenv 切换版本是一个不错的选择,但需要更多的工作。例如,这个高度赞成的答案中的 Homebrew 命令不再起作用。jenv 设置起来稍微困难一些,插件没有很好的文档记录,自述文件说该项目正在寻找新的维护者。jenv 仍然是一个伟大的项目,解决了工作,社区应该感谢他们的精彩贡献。SDKMAN 只是更好的选择,因为它非常棒。
  • Jabba 是一个多平台解决方案,在 Mac、Windows 和 PC 上提供相同的界面(它是用 Go 编写的,这就是它允许多平台的原因)。如果您关心多平台解决方案,这是一个巨大的卖点。如果您只关心在 Mac 上运行多个版本,那么您不需要多平台解决方案。如果您使用 Jabba,那么 SDKMAN 对数十种流行 SDK 的支持是您所缺少的。

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

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

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

于 2020-11-09T03:13:54.007 回答
0

要保留特定的主要版本,请使用 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
于 2020-10-15T13:05:39.200 回答
0

您可以以任何您想要的方式安装 JDK 版本。

  • 家酿
  • SDK 人
  • 手动

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

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

于 2021-06-22T15:36:40.393 回答