繁体   English   中英

如何在 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 15,甚至新的 Java 16。这包括来自 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!

您有几个关于如何进行安装以及管理 JDK 切换的选项。 安装可以通过 Homebrew、 SDKMANJabba或手动安装来完成。 可以通过JEnvSDKMANJabba或通过设置JAVA_HOME手动完成切换。 所有这些都在下面描述。


安装

首先,使用您喜欢的任何方法安装 Java,包括 Homebrew、SDKMAN 或手动安装 tar.gz 文件。 手动安装的优点是 JDK 的位置可以放在 Mac OSX 的标准化位置。 否则,还有更简单的选项,例如 SDKMAN,它们还会为 JVM 安装其他重要且常用的工具。

使用 SDKMAN 安装和切换版本

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

  1. https://sdkman.io/install安装 SDKMAN

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

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

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

     sdk default java 16-open

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

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

SDKMAN 会在您更改版本时自动为您管理PATHJAVA_HOME


从 OpenJDK 下载页面手动安装:

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

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

  3. JAVA_HOME环境变量设置为指向您解压 JDK 的方向。

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

使用 Homebrew 安装

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

  1. 如果您还没有安装 Homebrew ,请安装 确保它已更新:

     brew update
  2. 如果您想使用AdoptOpenJDK版本(往往是最新的),请添加桶水龙头:

     brew tap adoptopenjdk/openjdk

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

  3. 寻找可安装的版本:

     brew search java

    或者对于 AdoptOpenJDK 版本:

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

     brew info java

    或者对于 AdoptOpenJDK 版本:

     brew info adoptopenjdk
  5. 安装特定版本的 JDK,例如java11adoptopenjdk8adoptopenjdk11adoptopenjdk16 ,或者对于该发行版的最新版本,只安装javaadoptopenjdk 例如:

     brew install java brew install --cask adoptopenjdk16

这些将安装到/Library/Java/JavaVirtualMachines/ ,这是 Mac OSX 上预期的传统位置。

其他安装选项:

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 安装包。它安装到 Mac OSX 上的标准/Library/Java/JavaVirtualMachines/目录。

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


我的JDK在哪里?!?!

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

/usr/libexec/java_home -V

匹配Java虚拟机(8):
16、x86_64:“采用OpenJDK 16”/Library/Java/JavaVirtualMachines/adoptopenjdk-16.jdk/Contents/Home 15、x86_64:“OpenJDK 15”/Library/Java/JavaVirtualMachines/jdk-15s/Homek1/4Contents x86_64:“OpenJDK 14”/Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home 13,x86_64:“OpenJDK 13”/Library/Java/JavaVirtualMachines/openjdk-13.jdk/Contents/Home x86_64: “OpenJDK 12”/Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home
11、x86_64:“Java SE 11”/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、x86_64:“Java SE 9”/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
1.8.0_144、x86_64:“Java SE 8”/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home

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

/usr/libexec/java_home -v 16

/Library/Java/JavaVirtualMachines/adoptopenjdk-16.jdk/Contents/Home

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

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

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

手动切换版本

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

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

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

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

如前所述,使用/usr/libexec/java_home实用程序可帮助您通过识别不同 JDK 安装的位置来创建别名或运行命令来更改 Java 版本。 例如,在您的.profile.bash_profile创建 shell 别名来为您更改JAVA_HOME

export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_9_HOME=$(/usr/libexec/java_home -v9)
export JAVA_10_HOME=$(/usr/libexec/java_home -v10)
export JAVA_11_HOME=$(/usr/libexec/java_home -v11)
export JAVA_12_HOME=$(/usr/libexec/java_home -v12)
export JAVA_13_HOME=$(/usr/libexec/java_home -v13)
export JAVA_14_HOME=$(/usr/libexec/java_home -v14)
export JAVA_15_HOME=$(/usr/libexec/java_home -v15)
export JAVA_16_HOME=$(/usr/libexec/java_home -v16)

alias java8='export JAVA_HOME=$JAVA_8_HOME'
alias java9='export JAVA_HOME=$JAVA_9_HOME'
alias java10='export JAVA_HOME=$JAVA_10_HOME'
alias java11='export JAVA_HOME=$JAVA_11_HOME'
alias java12='export JAVA_HOME=$JAVA_12_HOME'
alias java13='export JAVA_HOME=$JAVA_13_HOME'
alias java14='export JAVA_HOME=$JAVA_14_HOME'
alias java15='export JAVA_HOME=$JAVA_15_HOME'
alias java16='export JAVA_HOME=$JAVA_16_HOME'

# default to Java 16
java16

然后要更改版本,只需使用别名。

java8
java -version

java版本“1.8.0_144”

当然,手动设置JAVA_HOME也可以!


使用 JEnv 切换版本

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

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

  2. 将任何 Java 版本添加到 JEnv(如果您将其放在其他地方,请调整目录):

     jenv add /Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home
  3. 使用以下命令设置您的全球版本:

     jenv global 16

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

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

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

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

$ 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 安装 openjdk@1.12.0

  4. 用它:

    jabba 使用 openjdk@1.12.0

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

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

我就是这样做的。

第 1 步:安装 Java 11

您可以从这里下载 Java 11 dmg for mac: 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

第四步:默认添加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

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

旧答案中所述,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
[...]

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

使用 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。

如果你想使用/管理多个版本,那么你可以使用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 配置文件中添加以下内容:

导出 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

另一种选择是使用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

换成:

  • 使用sdk use java 8.0.181-oracle切换到 JDK 8 sdk use java 8.0.181-oracle
  • 使用sdk use java 11.0.0-open切换到 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

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

brew install asdf

配置asdf后,安装java插件

asdf plugin-add java

选择要安装的版本

asdf list-all java

例如安装和配置adaptopenjdk8

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

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

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

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

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

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

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

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

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

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

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

要保持特定的主要版本,请使用 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

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

  • 家酿
  • SDK 人
  • 手动

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

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

我正在尝试安装需要在MacBook Pro上安装旧版Java SE 6运行时的软件。 但是,当我尝试安装Java旧版本时,会显示以下消息:“!” 该软件包的新版本已经安装。 有什么帮助或建议吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM