本文介绍如何在macOS上安装java jdk、自制包管理器、手动安装以及在不同JDK版本之间切换。
测试环境:
- macOS 11 Big Sur
- Homebrew 2.7.4
- JDK 8、14、16、16(采用OpenJDK和OpenJDK)
注意
从MacOS 10.15 Catalina开始,默认的终端shell从bash(BourneShell)切换到zsh(Zshell)。我们应该将 ~/.bash_profile
或 ~/.bashrc
中的所有启动脚本和环境变量移到 ~/.zshenv
或 ~/.zshrc
。
在macOS上安装最新的Java
1. 安装并升级Homebrew。
2. brew search java
以查找所有可用的java相关公式。
% brew search java ==> Formulae app-engine-java java javacc jslint4java pdftk-java google-java-format java11 javarepl libreadline-java
3. brew info
以显示公式详细信息。
java总是包含最新的java jdk(OpenJDK)GA版本;在编写本文时,最新的GA是jdk15。
% brew info java openjdk: stable 15.0.1 (bottled) [keg-only] Development kit for the Java programming language https://openjdk.java.net/ /usr/local/Cellar/openjdk/15.0.1 (614 files, 324.9MB) Poured from bottle on 2020-12-09 at 09:06:07 From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/openjdk.rb License: Cannot Represent
java11 formula 包含java11lts版本。
% brew info java11 openjdk@11: stable 11.0.9 (bottled) [keg-only] Development kit for the Java programming language https://openjdk.java.net/ Not installed From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/openjdk@11.rb License: GPL-2.0-only
4. brew install java
以安装最新的JDK 15。
% brew info java
5. Homebrew在哪里安装java?
Homebrew在 /usr/local/Cellar/openjdk/
安装了JDK文件和目录, /usr/local/opt/openjdk
的符号链接指向最新的Java15.0.1版本。
% ls -lsa /usr/local/Cellar/openjdk/ total 0 0 drwxr-xr-x 3 mkyong staff 96 Dec 9 09:06 . 0 drwxrwxr-x 69 mkyong admin 2208 Jan 15 15:35 .. 0 drwxr-xr-x 9 mkyong staff 288 Jan 15 16:47 15.0.1 % ls -lsa /usr/local/opt/openjdk 0 lrwxr-xr-x 1 mkyong admin 24 Dec 9 09:06 /usr/local/opt/openjdk -> ../Cellar/openjdk/15.0.1
6. java formula是 keg only ,这意味着它安装在 /usr/local/Cellar
中,但没有链接到 /usr/local/bin
或 /Library/java/JavaVirtualMachines/(macOS/usr/bin/java wrapper)
等位置。
为了让macOS /usr/bin/java
wrapper找到已安装的JDK,我们在 /Library/java/JavaVirtualMachines/
处手动创建一个符号链接。
% sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
7. 完成
% java -version openjdk version "15.0.1" 2020-10-20 OpenJDK Runtime Environment (build 15.0.1+9) OpenJDK 64-Bit Server VM (build 15.0.1+9, mixed mode, sharing)
在macOS上安装Java8
1. 安装和升级Homebrew。
2. brew search java
有没有java8
% brew search java ==> Formulae app-engine-java java javacc jslint4java pdftk-java google-java-format java11 javarepl libreadline-java
3. Java8在openjdk@8 formula。openjdk与java formula相同,并且它总是包含最新的JDK GA版本openjdk@11与java11 formula相同,包含JDK 11。
% brew search openjdk ==> Formulae openjdk openjdk@11 openjdk@8
4. 我们可以使用 openjdk@8
formula在macOS上安装Java8。
% brew install openjdk@8
5. 这个 openjdk@8
也只是一个 keg-only ;我们需要创建一个符号链接,以便macos java包装器可以找到它。
% sudo ln -sfn /usr/local/opt/openjdk@8/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-8.jdk
6. 完成
% java -version openjdk version "1.8.0_275" OpenJDK Runtime Environment (build 1.8.0_275-bre_2020_11_16_15_09-b00) OpenJDK 64-Bit Server VM (build 25.275-b00, mixed mode)
7. 如果我们安装了多个Java版本呢?
ls -lsah /Library/Java/JavaVirtualMachines/ openjdk-8.jdk -> /usr/local/opt/openjdk@8/libexec/openjdk.jdk openjdk.jdk -> /usr/local/opt/openjdk/libexec/openjdk.jdk
我们可以在 ~/.zshrc
处更新$PATH,这样macOS就可以找到正确安装的Java。
% java -version openjdk version "15.0.1" 2020-10-20 OpenJDK Runtime Environment (build 15.0.1+9) OpenJDK 64-Bit Server VM (build 15.0.1+9, mixed mode, sharing) % echo 'export PATH="/usr/local/opt/openjdk@8/bin:$PATH"' >> ~/.zshrc % source ~/.zshrc % java -version openjdk version "1.8.0_275" OpenJDK Runtime Environment (build 1.8.0_275-bre_2020_11_16_15_09-b00) OpenJDK 64-Bit Server VM (build 25.275-b00, mixed mode)
在macOS上设置$JAVA_HOME环境变量请参考这篇文章: https://javakk.com/1559.html
自制在macOS上安装指定的Java(OpenJDK)
adoptopenjdk/openjdk tap包含许多不同的JDK(adoptopenjdk)版本。
1. 通过openjdk/openjdk添加新的 tap
(第三方存储库)。
% brew tap adoptopenjdk/openjdk
2. 搜索相关的OpenJDK formula。
% brew search adoptopenjdk ==> Casks adoptopenjdk adoptopenjdk12-openj9 adoptopenjdk14-openj9-large adoptopenjdk-jre adoptopenjdk12-openj9-jre adoptopenjdk15 adoptopenjdk-openj9 adoptopenjdk12-openj9-jre-large adoptopenjdk15-jre adoptopenjdk-openj9-jre adoptopenjdk12-openj9-large adoptopenjdk15-openj9 adoptopenjdk-openj9-jre-large adoptopenjdk13 adoptopenjdk15-openj9-jre adoptopenjdk-openj9-large adoptopenjdk13-jre adoptopenjdk15-openj9-jre-large adoptopenjdk10 adoptopenjdk13-openj9 adoptopenjdk15-openj9-large adoptopenjdk11 adoptopenjdk13-openj9-jre adoptopenjdk8 adoptopenjdk11-jre adoptopenjdk13-openj9-jre-large adoptopenjdk8 adoptopenjdk11-openj9 adoptopenjdk13-openj9-large adoptopenjdk8-jre adoptopenjdk11-openj9-jre adoptopenjdk14 adoptopenjdk8-openj9 adoptopenjdk11-openj9-jre-large adoptopenjdk14-jre adoptopenjdk8-openj9-jre adoptopenjdk11-openj9-large adoptopenjdk14-openj9 adoptopenjdk8-openj9-jre-large adoptopenjdk12 adoptopenjdk14-openj9-jre adoptopenjdk8-openj9-large adoptopenjdk12-jre adoptopenjdk14-openj9-jre-large adoptopenjdk9
3. 我们选择采用openjdk14 formula来安装JDK14。
% brew install adoptopenjdk14 installer: Package name is AdoptOpenJDK installer: Installing at base path / installer: The install was successful. package-id: net.adoptopenjdk.14.jdk version: 14.0.2+12 volume: / location: Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk install-time: 1610720586 adoptopenjdk14 was successfully installed!
4. adoptopenjdk formula
直接在 /Library/Java/JavaVirtualMachines/
中创建JDK home。
% ls -lsa /Library/Java/JavaVirtualMachines/ adoptopenjdk-14.jdk openjdk-8.jdk -> /usr/local/opt/openjdk@8/libexec/openjdk.jdk openjdk.jdk -> /usr/local/opt/openjdk/libexec/openjdk.jdk
5. 由于JDK home已经在 /Library/Java/JavaVirtualMachines/
中,我们不需要创建任何符号链接,只需导出$PATH并将其指向正确的openjdk-14.JDK。
% echo 'export PATH="/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home/bin:$PATH"' >> ~/.zshrc % source ~/.zshrc % java -version openjdk version "14.0.2" 2020-07-14 OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.2+12) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.2+12, mixed mode, sharing)
在macOS上手动安装Java(早期访问版本)
出于某些原因,我们需要在macOS上手动安装Java:
- Anti-Homebrew,开发者喜欢控制一切。
- 与早期的access版本或oraclejdk一样,JDK版本不存在于自制存储库中。
1. 访问JDK 16早期访问构建网站并下载JDK。
2. 提取下载的tar.gz文件到 /Library/Java/JavaVirtualMachines
% sudo tar xvzf ~/Downloads/openjdk-16-ea+32_osx-x64_bin.tar.gz -C /Library/Java/JavaVirtualMachines % ls -lsa /Library/Java/JavaVirtualMachines adoptopenjdk-14.jdk jdk-16.jdk openjdk-8.jdk -> /usr/local/opt/openjdk@8/libexec/openjdk.jdk openjdk.jdk -> /usr/local/opt/openjdk/libexec/openjdk.jdk
3. 更新$PATH并指向 /Library/Java/JavaVirtualMachines/jdk-16.jdk
% echo 'export PATH="/Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home/bin:$PATH"' >> ~/.zshrc
4. 测试JDK16
% source ~/.zshrc % java -version openjdk version "16-ea" 2021-03-16 OpenJDK Runtime Environment (build 16-ea+32-2190) OpenJDK 64-Bit Server VM (build 16-ea+32-2190, mixed mode, sharing)
在不同的JDK版本之间切换
从上面的示例1到示例4,我们在macOS上安装了四个JDK版本。
1. 列出macOS上的所有JDK版本。
% /usr/libexec/java_home -V Matching Java Virtual Machines (4): 16 (x86_64) "Oracle Corporation" - "OpenJDK 16-ea" /Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home 15.0.1 (x86_64) "UNDEFINED" - "OpenJDK 15.0.1" /usr/local/Cellar/openjdk/15.0.1/libexec/openjdk.jdk/Contents/Home 14.0.2 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 14" /Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home 1.8.0_275 (x86_64) "UNDEFINED" - "OpenJDK 8" /usr/local/Cellar/openjdk@8/1.8.0+275/libexec/openjdk.jdk/Contents/Home /Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home % ls -lsa /Library/Java/JavaVirtualMachines adoptopenjdk-14.jdk jdk-16.jdk openjdk-8.jdk -> /usr/local/opt/openjdk@8/libexec/openjdk.jdk openjdk.jdk -> /usr/local/opt/openjdk/libexec/openjdk.jdk
2. 在 ~/.zshrc
(适用于macOS 10.15 Catalina及更高版本)或 ~/.bashrc
(适用于macOS 10.15 Catalina之前)中添加以下函数。
jdk() { version=$1 unset JAVA_HOME; export JAVA_HOME=$(/usr/libexec/java_home -v"$version"); java -version }
如果文件 ~/.zshrc
不存在,请创建它。
3. 来源 ~/.zshrc
以反映变化。
% source ~/.zshrc
4. 在不同的JDK版本之间切换。
% java -version openjdk version "16-ea" 2021-03-16 OpenJDK Runtime Environment (build 16-ea+32-2190) OpenJDK 64-Bit Server VM (build 16-ea+32-2190, mixed mode, sharing) % jdk 1.8 openjdk version "1.8.0_275" OpenJDK Runtime Environment (build 1.8.0_275-bre_2020_11_16_15_09-b00) OpenJDK 64-Bit Server VM (build 25.275-b00, mixed mode) % jdk 14 openjdk version "14.0.2" 2020-07-14 OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.2+12) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.2+12, mixed mode, sharing) % jdk 15 openjdk version "15.0.1" 2020-10-20 OpenJDK Runtime Environment (build 15.0.1+9) OpenJDK 64-Bit Server VM (build 15.0.1+9, mixed mode, sharing) % jdk 16 openjdk version "16-ea" 2021-03-16 OpenJDK Runtime Environment (build 16-ea+32-2190) OpenJDK 64-Bit Server VM (build 16-ea+32-2190, mixed mode, sharing)