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

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

我发现唯一一个能自动做更多事情的安装是通过Homebrew桶进行安装。它看起来也只有当前版本:

brew cask info java

显示:

< p > java: 13日33:5b8a42f3905b406298b72d750b6919f6 < br / > https://openjdk.java.net/ < / p >

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

387095 次浏览

注意: 这些解决方案适用于各种版本的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, Java 14, Java 15, Java 16, Java 17, Java 18,和最新的Java 19!

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

    或者java 19:

    sdk install java 19-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使用指南中以及它可以安装和管理的其他SDK的中获得,如Gradle, Maven, Kotlin, Quarkus, Spring Boot和许多其他。


安装和切换带有“asdf"

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

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

    brew reinstall asdf
    

    阅读文档来正确地设置你的shell,但是如果你正在使用ZSH Homebrew中的asdf,你可以执行这个命令来完成设置:

    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文件添加以下内容(假设你没有使用另一个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-19
    

就是这么简单!当你更改版本时,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. 安装自酿酒如果你还没有。确保已更新:

     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,例如java11temurin8temurin11temurin17,或者只是javatemurin,用于该发行版的最新版本。例如:

     brew install java
    
    
    brew install --cask temurin
    

这些将被安装到/Library/Java/JavaVirtualMachines/中,这是Mac OSX上的传统位置。在安装过程结束时,可能会有其他步骤使JDK处于活动状态。

从OpenJDK下载页面手动安装:

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

  1. http://jdk.java.net/下载OpenJDK for Mac OSX(例如Java 17Java 19)

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

  3. 设置JAVA_HOME环境变量指向你解归档JDK的方向。

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

其他安装选项:

其他类型的OpenJDK有:

Azul Systems Java Zulu认证的OpenJDK版本可以通过执行网站上的说明. exe命令安装。

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

< >强亚马逊Correto < / >强 OpenJDK构建为Java 8,11,15,16,17,18和Java 19提供了一个易于使用的安装包。它安装到Mac OSX上的标准/Library/Java/JavaVirtualMachines/目录。

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

微软Java JDK——微软的OpenJDK认证版本。


我的JDK在哪里?

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

/usr/libexec/java_home -V

匹配Java虚拟机(4):
19 (x86_64) "家酿"-“OpenJDK 19"/usr/local/Cellar/openjdk/19/libexec/openjdk.jdk /内容/ Home
18.0.1.1 (x86_64) "家酿"-“OpenJDK 18.0.1.1”;/usr/local/Cellar/openjdk/18.0.1.1/libexec/openjdk.jdk /内容/ Home
17 (x86_64)“家酿”;-“OpenJDK 17”;/usr/local/Cellar/openjdk/17/libexec/openjdk.jdk /内容/ Home
11、x86_64: "Java SE 11"/图书馆/ Java / JavaVirtualMachines / jdk - 11. jdk /内容/ Home
1.8.301.09 (x86_64) "甲骨文公司"——“Java"互联网/图书馆/插件/ JavaAppletPlugin。插件/内容/ /usr/local/Cellar/openjdk/17/libexec/openjdk.jdk /内容/家
< / p >

你也可以使用-v来报告特定Java版本的位置。例如,对于Java 17:

/usr/libexec/java_home -v 17

/usr/local/Cellar/openjdk/17/libexec/openjdk.jdk / Home /内容

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

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

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

版本切换

如果你正在使用SDKMANasdf,你已经覆盖了,可以停止阅读!否则,这里有一些选项可以切换现有的虚拟机安装。

手动切换版本

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。

更改jdk的简单方法是在你的~/.bashrc~/.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

编辑:

  • 删除了Jabba和JENV,因为两者似乎都停滞不前,问题数量急剧攀升,问题/PR没有得到维护者的解决。

另一种替代方法是使用SDKMAN!看到https://wimdeblauwe.wordpress.com/2018/09/26/switching-between-jdk-8-and-11-using-sdkman/

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

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

开关:

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

设置默认值:

  • 默认为JDK 8,使用sdk default java 8.0.181-oracle
  • 默认为JDK 11,使用sdk default java 11.0.0-open

恕我直言,没有必要安装所有额外的应用程序/包。

使用命令检查可用的版本:

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

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

正如这是以前的答案中详细描述的那样,在macOS上,/usr/bin/java是一个包装器工具,它将使用由JAVA_HOME指向的Java版本,或者如果该变量未设置,则将在/Library/Java/JavaVirtualMachines/下查找Java安装,并将使用最高版本的Java安装。它通过查看每个包下的Contents/Info.plist来确定版本。

有了这些知识,你可以:

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

我刚刚用OpenJDK &莫哈韦沙漠。

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

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

取消这个,下载OpenJDK 11 &12ea on https://jdk.java.net; 安装OpenJDK11: < / p >

$ 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
[...]

我是这么做的。

步骤1:安装Java 11

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

与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配置文件中添加以下内容:

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'

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

在终端:

< p > <代码> ~祝辞祝辞java7 出口JAVA_HOME = $ JAVA_7_HOME < /代码> < / p >

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

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初始化脚本,例如~/。zsh时的ZSHRC:

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

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

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

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

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

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

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

  • 家酿
  • SDK的男人
  • 手动

然后,我建议使用JENV在不同版本之间切换,并在全局或本地使用所需的JDK。

你可以在这里找到关于如何安装和使用JENV的更多细节-> https://blog.adamgamboa.dev/2021/06/17/using-jenv-to-switch-jkd-versions/ < / p >