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

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

brew cask info java

显示:

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

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


当前回答

如果您的机器上安装了多个版本,请在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

其他回答

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

正如这个旧的答案中所详细描述的,在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
[...]

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

我是这么做的。

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

如果您的机器上安装了多个版本,请在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

这个答案扩展了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的信息。