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


312

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

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

brew cask info java

显示:

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

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


只是问一下,我们可以将问题标记限制为一个版本吗?由于始终没有此类特定于版本的安装脚本/步骤。这是一个通用的问题(非特定于版本的问题),仅用java-11即可满足要求,因为我认为这是人们开始寻找问题和答案所建议的地方。
纳曼

答案中的脚本确实包含特定版本,即使很容易将其解释为其他版本。但是,它也是社区成员搜索的一部分,因此,通过帮助引起人们对最新和现代答案的关注,并与过时的版本6和版本8主题区分开来,可以帮助他们快速找到正确的答案。我认为拥有最新的稳定版本和最新的新版本是可以保留的合理标签。
杰森·米纳德

我可能会建议使用jenv来管理多个Java版本。
paranza

Answers:


713

注意: 这些解决方案适用于Java的各种版本,包括Java 8和新的Java 13,以及所列版本管理器涵盖的任何其他以前的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安装到非标准目录中。

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

使用Jabba安装

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

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

从OpenJDK下载页面手动安装:

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

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

用自制软件安装

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

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

    brew update
  2. 如果您还没有的话,请添加木桶水龙头(或者在步骤3中不再看到旧的Java版本):

    brew tap homebrew/cask-versions

    对于AdoptOpenJDK版本,添加该水龙头:

    brew tap adoptopenjdk/openjdk

    这些桶经常更改其Java版本,并且可能还会有其他带有其他Java版本的文件。

  3. 寻找可安装的版本:

    brew search java   

    或对于AdoptOpenJDK版本:

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

    brew cask info java

    或对于AdoptOpenJDK版本:

    brew cask info adoptopenjdk
  5. 安装JDK的特定版本,例如java11adoptopenjdk8或者只是javaadoptopenjdk当前。例如:

    brew cask install java

    您也可以使用旧版本的完全限定路径:

    brew cask install homebrew/cask-versions/java11

这些将安装/Library/Java/JavaVirtualMachines/在Mac OSX上的传统位置。

其他安装选项:

openJDK的其他一些风格是:

可以按照其站点上说明安装 Azul Systems Java Zulu认证的OpenJDK构建。

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

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

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


我的JDK在哪里?!?!

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

/usr/libexec/java_home -V

匹配的Java虚拟机(6):
13,x86_64:“ OpenJDK 13” /Library/Java/JavaVirtualMachines/openjdk-13.jdk/Contents/Home 12,x86_64:“ OpenJDK 12” / Library / Java / Java / JavaVirtualMachines / jdk-12 .jdk / Contents / Home
11,x86_64:“ Java SE 11
” /库/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

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

/usr/libexec/java_home -v 13

/图书馆/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home

当使用JEnv之类的工具,将本地安装添加到SDKMAN或在Jabba中链接系统JDK时,知道已安装JDK的位置也很有用,而且您需要知道在哪里可以找到它们。

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

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

手动切换版本

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

例如,如果您安装或解压缩了JDK 13,/Library/Java/JavaVirtualMachines/jdk-13.jdk使其为最高版本号,则它应该已经是默认版本号;如果不是,则可以简单地进行设置:

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

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

/usr/libexec/java_home如前所述,使用该实用程序可以帮助您创建别名或运行命令以通过识别不同JDK安装的位置来更改Java版本。例如,在中创建外壳别名.profile或为您.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)
export JAVA_13_HOME=$(/usr/libexec/java_home -v13)

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'

# default to Java 13
java13

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

java8
java -version

Java版本“ 1.8.0_144”

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


使用JEnv切换版本

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

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

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

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

    jenv global 13

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

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

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

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

$ 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。


使用SDKMAN安装和切换版本

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

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

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

    sdk list java
  3. 安装以下版本之一,例如Java 13:

    sdk install java 13.0.0-open 
  4. 将13设为默认版本:

    sdk default java 13.0.0-open

    或切换到13以进行会话:

    sdk use java 13.0.0-open

当使用list命令列出可用的安装版本时,您将看到各种各样的Java发行版:

sdk list java

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

sdk install java 8.0.181-oracle

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将自动管理PATH,并JAVA_HOME为你改变的版本为您服务。


使用Jabba安装和切换版本

Jabba还处理安装和切换。Jabba还将已安装的JDK放入其自己的目录树中,该目录树通常是~/.jabba/jdk

  1. 按照主页上说明安装Jabba 。

  2. 列出可用的JDK

    jabba ls-remote
  3. 安装Java JDK 12

    jabba install openjdk@1.12.0
  4. 用它:

    jabba use openjdk@1.12.0

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

贾巴将自动管理PATH,并JAVA_HOME为你改变的版本为您服务。


2
对于手动安装,我认为你需要设置JAVA_HOME,以便选择特定的版本,像export JAVA_HOME=$(/usr/libexec/java_home -v <version>).bash_profile
彼得·赫尔

@PeterHull一些Java版本管理器不喜欢JAVA_HOME手动设置,而是自己进行管理。JEnv肯定不会对以前设置的内容进行调整,不确定Jabba和SDKMAN,但通常由他们来管理该设置。只有使用NO版本切换的手动安装才能直接设置此值。
杰森·米纳德

完全同意,如果您能在回答中注意这会很好,因为最初的问题要求版本切换和设置JAVA_HOME是手动安装方法的唯一方法。
彼得·赫尔

2
昨日,2018
Xingang Huang,

16
可能是在MacOS上运行不同JDK的最广泛,最有用的答案,涉及许多不同的方法,其中一些我以前从未见过。
凯文·胡克'18

7

这就是我做的。

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

不错的解决方案。但是,如果在导出JAVA_HOME 11时仍将java -version指向8,该怎么办?
AlexGera

1
问题是关于Open JDK的问题,但您却链接到Oracle JDK。Open JDK似乎没有安装程序或安装说明。
Splaktar

1
作为对@AlexGera的响应,请添加以下行:export $ PATH = $ JAVA_HOME / bin:$ PATH
Fuad Efendi

6

在没有第三方工具的情况下手动切换系统默认版本:

详见 该较早答案中所述,macOS /usr/bin/java上的包装器工具将使用所指向的Java版本,JAVA_HOME或者如果未设置该变量/Library/Java/JavaVirtualMachines/,则将在其下查找Java安装并使用版本最高的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
[...]

您仍然可以通过手动设置按时使用版本12 JAVA_HOME

$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home
$ java -version
openjdk version "12-ea" 2019-03-19
[...]

1
它现在还应该是真实的与AdoptOpenJDK构建
雨果M.

6

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

别名java8 ='export JAVA_HOME = $ JAVA_HOME_8'

别名java9 ='export JAVA_HOME = $ JAVA_HOME_9'

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

在终端:

~ >> java7 export JAVA_HOME=$JAVA_7_HOME


是的,这里的另一个答案涵盖了这一点。
杰森·米纳德

3

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

换成:

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

3

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

1
Error: caskroom/cask was moved. Tap homebrew/cask-cask instead,然后fatal: repository 'https://github.com/Homebrew/homebrew-cask-cask/' not found
ChumiestBucket

@ChumiestBucket说什么-此解决方案有多个问题
javadba

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


第一个示例不应包含版本字符串1.8.0_181-zulu-8.31.0.1吗?还是部分匹配?
杰森·米纳德

使用Java版本实际上并没有任何改变,它只是报告的位置JAVA_HOME。我的其他答案涵盖了使用这些命令进行手动切换。
杰森·米纳德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.