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

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

brew cask info java


显示:


java:13,33:5b8a42f3905b406298b72d750b6919f6https:// openjdk.java.net/


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

评论

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

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

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

#1 楼

注意:这些解决方案适用于各种Java版本,包括Java 8,Java 11和新Java 15,以及所列版本管理器涵盖的任何其他先前Java版本。这包括来自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!
您有一些选择来进行安装和管理JDK切换。可以通过Homebrew,SDKMAN,Jabba或手动安装来完成安装。可以通过JEnv,SDKMAN,Jabba进行切换,也可以通过设置JAVA_HOME手动进行切换。所有这些都在下面描述。


安装
首先,使用您喜欢的任何方法(包括Homebrew,SDKMAN或手动安装tar.gz文件)安装Java。手动安装的优点是可以将JDK的位置放置在Mac OSX的标准位置。否则,有一些更简单的选项,例如SDKMAN,它们也将为JVM安装其他重要的通用工具。
使用SDKMAN安装和交换版本
SDKMAN有点不同,可以处理安装和交换。 SDKMAN还将已安装的JDK放入其自己的目录树中,该目录树通常为~/.sdkman/candidates/java。 SDKMAN允许设置全局默认版本以及特定于当前shell的版本。


从https://sdkman.io/install


列出可用的Java版本,以确保您知道版本ID
 sdk list java
 



安装其中一个版本,例如Java 15:
 sdk install java 15-open 
 




将15设置为默认值版本:
 sdk default java 15-open
 

或切换到15以进行会话:
 sdk use java 15-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会自动在更改版本时为您管理PATHJAVA_HOME

从OpenJDK下载页面手动安装:


从http:// jdk下载Mac OSX的OpenJDK。 .java.net /(例如Java 15)


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


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


如果尚未安装,请安装Homebrew。确保已更新:
  brew update
 



如果要使用,请添加木桶水龙头。 AdoptOpenJDK版本(可能是最新版本):
  brew tap adoptopenjdk/openjdk
 

这些容器经常更改其Java版本,并且可能其他带有其他Java版本的应用程序。


寻找可安装的版本:
  brew search java   
 

,或者寻找AdoptOpenJDK版本:
  brew search jdk     
 



检查有关将安装的版本的详细信息:
  brew info java
 

或AdoptOpenJDK版本:
  brew info adoptopenjdk
 



安装特定JDK版本,例如java11adoptopenjdk8adoptopenjdk13,或者只是javaadoptopenjdk,以表示该发行版中的最新版本。例如:
  brew install java

 brew cask install adoptopenjdk13
 



它们将被安装到传统位置/Library/Java/JavaVirtualMachines/中在Mac OSX上。
其他安装选项:
其他一些OpenJDK版本包括:
Zulu®是OpenJDK的经过认证的版本,完全符合Java SE标准。 Zulu是100%开放源代码,可免费下载。现在,Java开发人员,系统管理员和最终用户可以享受开放源Java的全部好处,并且具有部署灵活性并可以控制升级时间。

Amazon Correto OpenJDK构建具有易于使用的安装包,可用于Java 8或Java 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中,使用:
 /usr/libexec/java_home -V
 


匹配Java虚拟机(8 ):
15,x86_64:“ OpenJDK 15” /库/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home
14,x86_64:“ OpenJDK 14” /库/ Java / Java / JavaVirtualMachines / jdk -14.jdk / Contents / Home
13,x86_64:“ OpenJDK 13” /库/Java/JavaVirtualMachines/openjdk-13.jdk/Contents/Home
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 / JavaVirt ualMachines / jdk-9.jdk / Contents / Home
1.8.0_144,x86_64:“ Java SE 8” /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home

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


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

使用JEnv之类的工具,向SDKMAN添加本地安装或在Jabba中链接系统JDK时,了解已安装JDK的位置也很有用-并且您需要知道在哪里找到他们。
如果需要找到其他工具安装的JDK,请检​​查以下位置:

SDKMAN安装到~/.sdkman/candidates/java/

Jabba安装到~/.jabba/jdk



手动切换版本
Java可执行文件是一个包装程序,它将使用JAVA_HOME中配置的JDK进行包装,因此您可以更改它以更改正在使用的JDK。
例如,如果您已将JDK 15安装或解压到/Library/Java/JavaVirtualMachines/jdk-15.jdk,如果它是最高版本号,则应该已经是默认版本号;如果不是,则可以简单地设置:
 export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home
 

,现在路径中的所有Java可执行文件都将看到此文件并使用正确的JDK。确定不同JDK安装的位置。例如,在您的/usr/libexec/java_home.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)
export JAVA_14_HOME=$(/usr/libexec/java_home -v14)
export JAVA_15_HOME=$(/usr/libexec/java_home -v15)

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'
alias java14='export JAVA_HOME=$JAVA_14_HOME'
alias java15='export JAVA_HOME=$JAVA_15_HOME'

# default to Java 15
java15
 


java版本“ 1.8.0_144”

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

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


如果需要,请安装JEnv。还没有,http://www.jenv.be/网站上的有关手动安装或使用Homebrew的说明。


将任何Java版本添加到JEnv(如果需要,请调整目录将此放置在其他位置):
 /Library/Java/JavaVirtualMachines/ 



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



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

有关更多命令,请参见JEnv文档。现在,您可以随时在整个系统,外壳程序或每个本地目录的任何Java版本(Oracle,OpenJDK等)之间进行切换。
要在使用JEnv时帮助管理jenv add,可以将export插件添加到
 jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home 
jenv versions
 

如果已经设置了导出插件,则它可能无法调整JAVA_HOME,因此您可能需要清除
还可以使用$ jenv enable-plugin export You may restart your session to activate jenv export plugin echo export plugin activated 运行单个命令,并为该命令正确设置JAVA_HOMEjenv exec <command> <parms...>,以运行单个命令,其中包括打开另一个外壳。

使用Jabba安装和交换版本
Jabba还处理安装和交换。 Jabba还将已安装的JDK放在其自己的目录树中,该目录树通常是JAVA_HOME


按照主页上的说明安装Jabba。


列出可用的JDK
jabba ls-remote


安装Java JDK 12
jabba安装openjdk@1.12.0


使用它:
jabba使用openjdk@1.12.0


您还可以为版本名加上别名,链接到已经安装的现有JDK,并找到有趣的JDK的混合物作为GraalVM,采用JDK,IBM JDK等。完整的使用指南也可在主页上找到。
Jabba会在您更改版本时自动为您管理PATH~/.jabba/jdk

评论


对于手动安装,我认为您需要设置JAVA_HOME才能选择特定版本,例如.bash_profile中的export JAVA_HOME = $(/ usr / libexec / java_home -v )。

– Peter Hull
18-09-27在8:20

昨天,2018年10月3日,酿造桶中的Java更改为OpenJDK 11。

– Alpha Huang
18-10-4在17:30

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

–凯文·胡克(Kevin Hooke)
18-10-20在19:44

@VitaliiDmitriev酒桶会随着时间变化。您可以通过以下方法来安装acceptopenopenjdk版本:点按brew tap tapopenopendk / openjdk,然后brew搜索jdk以查看版本。也许还有其他用途,但是hombrew从其默认容器中删除了一些Java版本。

–杰森·米纳德(Jayson Minard)
19年6月20日在15:26

对于那些考虑使用sdkman安装JDK + jenv进行切换的人:您需要知道sdkman安装的JAVA_HOME等效项是〜/ .sdkman / candidates / java / 。但是无论如何,如果您可以留下来而不是sdkman,那就更容易了。

–hmijail哀悼辞职者
19年11月11日在5:23



#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


评论


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

– AlexGera
19年2月20日在13:07

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

–Splaktar
19年2月28日在19:25

响应@AlexGera-添加以下行:export $ PATH = $ JAVA_HOME / bin:$ PATH

–埃芬迪港
20-2-5在2:59



#3 楼

手动切换没有第3方工具的系统默认版本:

如该旧答案中所述,在macOS上,/usr/bin/java是包装工具,将使用JAVA_HOME指向的Java版本,或者如果未设置该变量,则看起来适用于/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
 


System Java返回到11:设置$ java -version openjdk version "11.0.1" 2018-10-16 [...]

 JAVA_HOME 


评论


而且现在AdoptOpenJDK构建也应该如此

– Hugues M.
18-10-30在21:29

#4 楼

假设使用Homebrew和jenv:

:Mac机器,并且您已经安装了Homebrew。

安装桶:

$ 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


评论


错误:桶/桶已移动。而是点击homebrew / cask-cask,然后致命:未找到存储库“ https://github.com/Homebrew/homebrew-cask-cask/”

–ChumiestBucket
19-10-25在15:54

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

– StephenBoesch
19年12月28日在2:00

#5 楼

如果您的计算机上安装了多个版本,请在bash配置文件中添加以下内容:


export 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)

< br并添加以下别名:


别名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

评论


是的,这是在这里的另一个答案。

–杰森·米纳德(Jayson Minard)
19-10-21在15:58

#6 楼

另一种选择是使用SDKMAN!参见https://wimdeblauwe.wordpress.com/2018/09/26/switching-between-jdk-8-and-11-using-sdkman/

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


使用以下命令安装Oracle JDK 8:sdk install java 8.0.181-oracle

使用以下命令安装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



#7 楼

您可以使用asdf在多个Java版本之间进行安装和切换。它还具有其他语言的插件。您可以使用Homebrew安装asdf
brew install asdf

配置asdf时,安装Java插件
asdf plugin-add java

选择要安装的版本
asdf list-all java

例如安装并配置takeopenjdk8
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


#8 楼

恕我直言,无需安装所有其他应用程序/软件包。

使用以下命令检查可用版本:

> /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吗?还是部分匹配?

–杰森·米纳德(Jayson Minard)
18-10-7在11:37

使用Java版本实际上并没有任何改变,它只是报告JAVA_HOME的位置。我的其他答案涵盖了使用这些命令进行手动切换。

–杰森·米纳德(Jayson Minard)
18-10-7在12:01

#9 楼

该答案在Jayson的出色答案的基础上扩展了一些针对您的用例的最佳方法的更深刻的指导:

SDKMAN是大多数用户的最佳解决方案。它易于使用,没有任何怪异的配置,并且还可以轻松管理许多其他Java生态系统项目的多个版本。
通过Homebrew下载Java版本并通过jenv切换版本是一个不错的选择,但需要更多的工作。例如,此高度支持的答案中的Homebrew命令不再起作用。 jenv的设置难度稍大,插件的文档记录不充分,README文件说该项目正在寻找新的维护者。 jenv仍然是一个伟大的项目,可以解决工作,社区应该为所做的出色贡献表示感谢。 SDKMAN就是一个更好的选择,因为它是如此的棒。
Jabba是一个多平台解决方案,它在Mac,Windows和PC上提供了相同的界面(它是用Go语言编写的,因此可以使其成为多平台)。 。如果您关心多平台解决方案,这是一个巨大的卖点。如果您只想在Mac上运行多个版本,则不需要多平台解决方案。如果与Jabba一起使用,SDKMAN对数十种受欢迎的SDK的支持就会丢失。

手动管理版本可能是最糟糕的选择。如果您决定手动切换版本,则可以使用此Bash代码代替Jayson的详细代码(homebrew-openjdk README的代码段:
jdk() {
        version=
        export JAVA_HOME=$(/usr/libexec/java_home -v"$version");
        java -version
 }

Jayson的答案提供了SDKMAN和jenv的基本命令。如需有关这些工具的更多背景知识,请参见SDKMAN的更多信息和jenv的更多信息。

#10 楼

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