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

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

brew cask info java

显示:

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

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


注意:这些解决方案适用于各种版本的Java,包括Java 8到Java 17 (LTS版本)和Java 18。这包括来自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、SDKMAN、asdf或手动安装完成。切换可以通过SDKMAN、asdf完成,也可以通过设置JAVA_HOME手动完成。所有这些都在下面描述。


TL;DR -首选安装方法

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

但是,还有一些更简单的选项,比如SDKMAN和asdf,它们也会为JVM安装其他重要的常用工具。这里描述了这两个主要选项。

使用SDKMAN安装和切换版本

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

从https://sdkman.io/install安装SDKMAN 列出可用的Java版本,以确保您知道版本ID SDK列表 安装其中一个版本,例如Java 17 LTS: SDK安装Java 17-open 或者java 19: SDK安装Java 19-open 将Java 17设置为默认版本: SDK默认Java 17-open 或者切换到当前终端会话的17: SDK使用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将自动为您管理PATH和JAVA_HOME。注意,它将Java版本安装到~/.sdkman/candidate / Java /。

更多信息可在SDKMAN使用指南以及其他SDK,如Gradle, Maven, Kotlin, Quarkus, Spring Boot,和许多其他可以安装和管理。


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

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

First, install asdf via https://asdf-vm.com/guide/getting-started.html (read there to setup your shell correctly), or more simply: brew reinstall asdf and read the doc for setting up your shell correctly, but if you are using asdf from Homebrew with ZSH you can execute this command to finish setup: echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc Then install the Java plugin via https://github.com/halcyon/asdf-java asdf plugin add java and read the doc for setting up your shell correctly before continuing. Basically it says to add the following to your ~/.zshrc file (assuming you are not using another shell): . ~/.asdf/plugins/java/set-java-home.zsh Now list Java versions: asdf list-all java Install your favorite flavor and version: asdf install java openjdk-17 or install the latest: asdf install java latest

其他重要的命令有……

列出您已安装的版本: Asdf列表Java 设置Java全局版本: Asdf全局Java openjdk-17 设置目录的本地Java版本: Asdf本地Java openjdk-19

就是这么简单!当您更改版本时,asdf将自动为您管理PATH和JAVA_HOME。注意,asdf将Java版本安装到~/.asdf/ installing / Java。

asdf还有其他语言和插件,请访问存储库页面:https://github.com/asdf-vm/asdf-plugins


其他安装方法

使用Homebrew安装

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

install Homebrew if you haven't already. Make sure it is updated: brew update Add the casks tap: brew tap homebrew/cask-versions These casks change their Java versions often, and there might be other taps out there with additional Java versions. Look for installable versions: brew search java or for Eclipse Temurin versions: brew search temurin Check the details on the version that will be installed: brew info java or for the Temurin version: brew info temurin Install a specific version of the JDK such as java11, temurin8, temurin11, temurin17, or just java or temurin for the most current of that distribution. For example: brew install java brew install --cask temurin

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

从OpenJDK下载页面手动安装:

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

从http://jdk.java.net/下载OpenJDK for Mac OSX(例如Java 17和Java 19) 解压OpenJDK tar文件,并将生成的文件夹(即JDK -17. JDK)放到你的/Library/Java/JavaVirtualMachines/文件夹中,因为这是JDK安装的标准和预期位置。在现实中,你也可以安装在任何你想要的地方。 将JAVA_HOME环境变量设置为指向您解归档JDK的方向。

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

其他安装选项:

其他类型的OpenJDK有:

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

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

Amazon 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应用程序。

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


我的JDK在哪里?

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

/usr/libexec/java_home -V

Matching Java Virtual Machines (4): 19 (x86_64) "Homebrew" - "OpenJDK 19" /usr/local/Cellar/openjdk/19/libexec/openjdk.jdk/Contents/Home 18.0.1.1 (x86_64) "Homebrew" - "OpenJDK 18.0.1.1" /usr/local/Cellar/openjdk/18.0.1.1/libexec/openjdk.jdk/Contents/Home 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 /地窖openjdk / 17 / libexec openjdk jdk /地点/ Home。

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

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

SDKMAN安装到~/.sdkman/candidate /java/ Asdf安装到~/.asdf/ installing /java


版本切换

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

手动切换版本

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然后…

安装Oracle JDK 8使用 安装OpenJDK 11

开关:

使用java 8.0.181-oracle切换到带有sdk的JDK 8 使用java 11.0.0-open切换到带有sdk的JDK 11

设置默认值:

默认JDK 8, sdk默认java 8.0.181-oracle 默认为JDK 11, sdk默认为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来确定版本。在每个包下面写上。

有了这些知识,你可以:

通过重命名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
[...]

我是这么做的。

步骤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)

并添加以下别名:

别名java7=“出口JAVA_HOME=$ java_home_7” 别名java8=“出口JAVA_HOME=$ java_home_8” 别名java9=“出口JAVA_HOME=$ java_home_9”

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

在终端:

~ >> java7 出口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 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 is the best solution for most users. It's easy to use, doesn't have any weird configuration, and makes managing multiple versions for lots of other Java ecosystem projects easy as well. Downloading Java versions via Homebrew and switching versions via jenv is a good option, but requires more work. For example, the Homebrew commands in this highly upvoted answer don't work anymore. jenv is slightly harder to setup, the plugins aren't well documented, and the README says the project is looking for a new maintainer. jenv is still a great project, solves the job, and the community should be thankful for the wonderful contribution. SDKMAN is just the better option cause it's so great. Jabba is written is a multi-platform solution that provides the same interface on Mac, Windows, and PC (it's written in Go and that's what allows it to be multiplatform). If you care about a multiplatform solution, this is a huge selling point. If you only care about running multiple versions on your Mac, then you don't need a multiplatform solution. SDKMAN's support for tens of popular SDKs is what you're missing out on if you go with 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的信息。


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

家酿 SDK的男人 手动

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

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