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

时间:2018-09-26 18:32:31

标签: java java-11

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

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

brew cask info java

显示:

  

java:12,33
  https://jdk.java.net/

所以我可以从那里安装,那又如何呢?我只能坚持使用新版本吗?

更新: 截至2019年3月19日,自制酒桶现在指向OpenJDK 12

11 个答案:

答案 0 :(得分:341)

注释: 这些解决方案适用于各种Java版本,包括Java 11和新Java 12,以及所列版本管理器涵盖的任何其他先前Java版本。这包括来自OpenJDK,Oracle,IBM,Azul,Amazon Correto,Graal等的替代JDK。轻松使用Java 7,Java 8,Java 9,Java 10,Java 11,Java 12,甚至可以早期使用Java 13!

您可以选择几种方式来进行安装以及管理JDK切换。可以通过Homebrew,SDKMANJabba或手动安装来完成安装。切换可以通过JEnvSDKMANJabba完成,也可以通过设置JAVA_HOME手动完成。所有这些都在下面描述。


安装

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

使用SDKMAN安装

这是一个简单的模型,它可以处理安装和版本切换,但需要注意的是它将JDK安装到非标准目录中。

<< em>请参见下面的“使用SDKMAN安装和切换版本” >

使用Jabba安装

这也是一个简单的模型,因为安装和版本切换均由同一工具处理。安装是在非标准目录中进行的。

<< em>请参见下面的“使用Jabba安装和切换版本” >

从OpenJDK下载页面手动安装:

  1. http://jdk.java.net/

  2. 下载适用于Mac OSX的OpenJDK
  3. 取消存档OpenJDK tar,并将生成的文件夹(即jdk-12.jdk)放入您的/Library/Java/JavaVirtualMachines/文件夹中,因为这是JDK安装的标准位置。您还可以在现实中想要的任何地方安装。

使用Homebrew安装

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

  1. install Homebrew(如果尚未安装)。确保已更新:

    brew update
    
  2. 添加酒桶水龙头(如果尚未安装)

    brew tap homebrew/cask-versions
    
  3. 寻找可安装的版本:

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

    brew cask info java
    
  5. 安装特定版本的JDK,例如java8java9java10java11java12或仅{{1 }}当前版本:

    java

    AdoptOpenJDK版本现在也可以从Homebrew Cask中获得:

    brew cask install java
    

这些将安装到Mac OSX上的传统位置brew cask install adoptopenjdk 中。

其他安装选项:

openJDK的其他一些风味是:

Azul Systems Java Zulu 认证的OpenJDK构建可以通过遵循instructions on their site来安装。

  

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

Amazon Correto OpenJDK构建具有易于使用的版本8或版本11(其他版本即将推出)的安装软件包,并安装到Mac OSX上的标准/Library/Java/JavaVirtualMachines/目录中。

  

Amazon Corretto是Open Java Development Kit(OpenJDK)的免费,多平台,可立即投入生产的发行版。 Corretto带有长期支持,其中包括性能增强和安全修复。亚马逊内部在数千种生产服务上运行Corretto,Corretto被证明与Java SE标准兼容。使用Corretto,您可以在流行的操作系统(包括Linux,Windows和macOS)上开发和运行Java应用程序。


我的JDK在哪里?!?!

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

/Library/Java/JavaVirtualMachines/
  

匹配Java虚拟机(5):
    12,x86_64:“ OpenJDK 12” /库/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

您还可以使用/usr/libexec/java_home -V 报告特定Java版本的位置。例如对于Java 12:

-v
  

/Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home

使用JEnv之类的工具,将本地安装添加到SDKMAN或在Jabba中链接系统JDK时,知道已安装JDK的位置也很有用。

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

  • SDKMAN安装到/usr/libexec/java_home -v 12
  • Jabba安装到~/.sdkman/candidates/java/

手动切换版本

Java可执行文件是一个包装程序,它将使用~/.jabba/jdk中配置的JDK,因此您可以对其进行更改以更改所使用的JDK。

例如,如果您将JDK 12安装或解压缩到JAVA_HOME,如果它是最高版本号,则它应该已经是默认版本号;如果不是,则可以简单地设置:

/Library/Java/JavaVirtualMachines/jdk-12.jdk

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

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

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)

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'

# default to Java 12
java12
  

java版本“ 1.8.0_144”

当然,手动设置java8 java -version 也可以!


使用JEnv切换版本

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

  1. 如果尚未安装JEnv,请在http://www.jenv.be/网站上进行手动安装或使用Homebrew的说明。

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

    /Library/Java/JavaVirtualMachines/
  3. 使用以下命令设置全局版本:

    jenv add /Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home
    

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

jenv add

有关更多命令,请参见JEnv docs。现在,您可以随时在整个系统,外壳程序或每个本地目录之间的任何Java版本(Oracle,OpenJDK等)之间进行切换。

要在使用JEnv时帮助管理jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home jenv versions ,可以添加export plugin为您完成此操作。

JAVA_HOME

如果已设置导出插件,$ jenv enable-plugin export You may restart your session to activate jenv export plugin echo export plugin activated 可能不会进行调整,因此您可能需要清除配置文件中的此变量,以便可以由JEnv对其进行管理。

您还可以使用JAVA_HOME运行单个命令,并为该命令正确设置jenv exec <command> <parms...>JAVA_HOME,这可能包括打开另一个shell。


使用SDKMAN安装和切换版本

SDKMAN稍有不同,它可以处理安装和切换。 SDKMAN还将已安装的JDK放入其自己的目录树中,该目录树通常为PATH。 SDKMAN允许设置全局默认版本以及特定于当前Shell的版本。

  1. https://sdkman.io/install

  2. 安装SDKMAN
  3. 使用SDKMAN安装Java 12:

    ~/.sdkman/candidates/java
  4. 将12设为默认版本:

    sdk install java 12.0.0-open 
    

    或将会话切换为12:

    sdk default java 12.0.0-open
    

您可以使用list命令列出可用的安装版本:

sdk use java 12.0.0-open

并安装其他版本,例如JDK 8:

sdk list java

SDKMAN可以使用以前安装的现有版本。只需进行本地安装即可提供自己的版本标签和JDK的位置:

sdk install java 8.0.181-oracle

并自由使用它:

sdk install java my-local-12 /Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home

SDKMAN Usage Guide以及other SDK's可以安装和管理更多信息。

SDKMAN会在您更改版本时自动为您管理sdk use java my-local-12 PATH


使用Jabba安装和切换版本

Jabba还可处理安装和切换。 Jabba还将已安装的JDK放置在其自己的目录树中,该目录树通常为JAVA_HOME

  1. 按照instructions on the home page安装Jabba。

  2. 列出可用的JDK's

    ~/.jabba/jdk
  3. 安装Java JDK 12

    jabba ls-remote
    
  4. 使用它:

    jabba install openjdk@1.12.0
    

您还可以别名版本名称,链接到已安装的现有JDK,并找到有趣的JDK(例如GraalVM,Adopt JDK,IBM JDK等)的混合体。完整的usage guide也可在主页上找到。

Jabba会在您更改版本时自动为您管理jabba use openjdk@1.12.0 PATH

答案 1 :(得分:3)

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

this older answer中所述,在macOS /usr/bin/java上是一个包装器工具,将使用JAVA_HOME所指向的Java版本,或者如果未设置该变量,则会在{{ 1}},并将使用版本最高的版本。它通过查看每个软件包下的/Library/Java/JavaVirtualMachines/来确定版本。

有了这些知识,您可以:

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

我刚刚验证了OpenJDK和Mojave的正确性。

在全新系统上,未安装Java版本:

$JAVA_HOME

取消此操作,在https://jdk.java.net上下载OpenJDK 11和12ea; 安装OpenJDK11:

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

系统Java现在是11:

$ cd /Library/Java/JavaVirtualMachines/
$ sudo tar xzf ~/Downloads/openjdk-11.0.1_osx-x64_bin.tar.gz

安装OpenJDK12(目前可早期访问):

$ java -version
openjdk version "11.0.1" 2018-10-16
[...]

系统Java现在是12:

$ sudo tar xzf ~/Downloads/openjdk-12-ea+17_osx-x64_bin.tar.gz 

现在让我们从系统Java包装器中“隐藏” OpenJDK 12:

$ java -version
openjdk version "12-ea" 2019-03-19
[...]

系统Java回到11:

$ cd jdk-12.jdk/Contents/
$ sudo mv Info.plist Info.plist.disabled

您仍然可以通过手动设置$ java -version openjdk version "11.0.1" 2018-10-16 [...] 准时使用版本12:

JAVA_HOME

答案 2 :(得分: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

答案 3 :(得分:2)

这就是我的方法。

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

答案 4 :(得分:1)

此答案在Jayson的出色回答的基础上,针对您的用例的最佳方法提供了一些更自以为是的指导:

  • SDKMAN是大多数用户的最佳解决方案。它易于使用,没有任何怪异的配置,并且使管理lots of other Java ecosystem项目的多个版本也变得很容易。
  • 通过Homebrew下载Java版本并通过jenv切换版本是一个不错的选择,但是需要更多的工作。例如,the Homebrew commands in this highly upvoted answer不再起作用。 jenv的设置难度稍大,plugins的文档记录不充分,README文件说该项目正在寻找新的维护者。 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的基本命令。如果您想了解更多有关这些工具的背景信息,请参见SDKMANjenv的更多信息。

答案 5 :(得分:0)

另一种替代方法是使用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 11.0.0-open切换到JDK 11

要设置默认值:

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

答案 6 :(得分:0)

使用Homebrew和jenv:

假设:Mac机器上,您已经安装了自制软件。

安装酒桶:

$ brew tap caskroom/cask
$ brew tap caskroom/versions

要安装最新的Java:

$ brew cask install java

要安装Java 8:

$ brew cask install java8

要安装Java 9:

$ brew cask install java9

如果要安装/管理多个版本,则可以使用“ jenv”:

安装和配置jenv:

$ brew install jenv
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(jenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

将已安装的Java添加到jenv:

$ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
$ jenv add /Library/Java/JavaVirtualMachines/jdk1.11.0_2.jdk/Contents/Home

要查看所有已安装的java:

$ jenv versions

上面的命令将给出已安装的Java的列表:

* system (set by /Users/lyncean/.jenv/version)
1.8
1.8.0.202-ea
oracle64-1.8.0.202-ea

配置要使用的Java版本:

$ jenv global oracle64-1.6.0.39

答案 7 :(得分:0)

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

     

别名java9 ='export JAVA_HOME = $ JAVA_HOME_9'

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

在终端中:

~ >> java7 export JAVA_HOME=$JAVA_7_HOME

答案 8 :(得分: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

答案 9 :(得分:0)

您可以通过任何方式安装 JDK 版本。

  • 家酿
  • SDK 人员
  • 手动

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

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

答案 10 :(得分:-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与1.8.0_151