Mac 上安装 Java 多版本
·784 字·2 分钟
工具 & 生产效率
java
Java 现在是一年一个版本(每六个月就能获得新版本),加快迭代的速度,每一个版本将延续前一个版本的新特性,但只有 LTS(Long-Term-Support)版本得到长期维护,见下表:
考虑到 Java 庞大的生态和生产环境,估计 Java8 还会呆很长一段时间,所以机器上得上多版本:
- 先看看 brew 提供的 Java 版本
[I] ➜ brew search java
==> Formulae
app-engine-java java ✔ javacc jslint4java pdftk-java
google-java-format java11 javarepl libreadline-java
==> Casks
charles-applejava eclipse-javascript java-beta oracle-jdk-javadoc
eclipse-java font-noto-sans-javanese java6
If you meant "java" specifically:
It was migrated from homebrew/cask to homebrew/core.
java 指向当前可获得的最新版本(当下是 17),java11 则是另一个可获得的(旧)版本
这时可以执行 brew install java 或者 brew install java11 安装
如果需要更多的版本选择,需要加入源 adoptopenjdk/openjdk
[I] ➜ brew tap adoptopenjdk/openjdk
看看有什么版本选择:
[I] ➜ brew search jdk
==> Formulae
openjdk ✔ openjdk@11
==> Casks
adoptopenjdk adoptopenjdk12-openj9-large adoptopenjdk8 ✔
adoptopenjdk10 adoptopenjdk13 adoptopenjdk8 ✔
adoptopenjdk11 adoptopenjdk13-jre adoptopenjdk8-jre
adoptopenjdk11-jre adoptopenjdk13-openj9 adoptopenjdk8-openj9
adoptopenjdk11-openj9 adoptopenjdk13-openj9-jre adoptopenjdk8-openj9-jre
adoptopenjdk11-openj9-jre adoptopenjdk13-openj9-jre-large adoptopenjdk8-openj9-jre-large
adoptopenjdk11-openj9-jre-large adoptopenjdk13-openj9-large adoptopenjdk8-openj9-large
adoptopenjdk11-openj9-large adoptopenjdk14 adoptopenjdk9
adoptopenjdk12 adoptopenjdk14-jre jdk-mission-control
adoptopenjdk12-jre adoptopenjdk14-openj9 oracle-jdk
adoptopenjdk12-openj9 adoptopenjdk14-openj9-jre oracle-jdk-javadoc
adoptopenjdk12-openj9-jre adoptopenjdk14-openj9-jre-large sapmachine-jdk
adoptopenjdk12-openj9-jre-large adoptopenjdk14-openj9-large
- 选择版本安装,例如:
[I] ➜ brew cask install adoptopenjdk8
- Mac 的 Java 标准安装目录在 /Library/Java/JavaVirtualMachines ,brew 采纳的安装目录则是 /usr/local/opt,需要 symlink 一下:
sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
如果不是默认版本,例如 brew install java11:
sudo ln -sfn /usr/local/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk
adoptopenjdk 的安装已经替我们做好了这一步,所以不需要 symlink。
- 看看本机上所有安装的 Java 版本:
[I] ➜ ll /Library/Java/JavaVirtualMachines/
Permissions Size User Date Modified Name
drwxr-xr-x - root 21 Apr 06:57 adoptopenjdk-8.jdk/
lrwxr-xr-x 42 root 23 Sep 15:18 openjdk.jdk -> /usr/local/opt/openjdk/libexec/openjdk.jdk/
[I] ➜ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
17 (x86_64) "Homebrew" - "OpenJDK 17" /usr/local/Cellar/openjdk/17/libexec/openjdk.jdk/Contents/Home
1.8.0_292 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 8" /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
/usr/local/Cellar/openjdk/17/libexec/openjdk.jdk/Contents/Home
安装了 17(openjdk) 和 8(adoptopenjdk8) 两个版本
- 切换不同的版本
把这段加入 .bash 或 .zshrd
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
jdk() {
if [ ! -n "$1" ]; then
/usr/libexec/java_home -V 2>&1
else
export JAVA_HOME=`/usr/libexec/java_home -v $1`
echo "JAVA_HOME switched to '$JAVA_HOME'."
fi
}
}
默认的就是 java8,通过 jdk xxx 来切换到想要的版本:
[I] ➜ java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.292-b10, mixed mode)
(base) 15:40:17 in ~ via ⬢ v16.9.1 via 🅒 base
[I] ➜ jdk 17
JAVA_HOME switched to '/usr/local/Cellar/openjdk/17/libexec/openjdk.jdk/Contents/Home'.
(base) 15:40:59 in ~ via ⬢ v16.9.1 via 🅒 base
[I] ➜ java -version
openjdk version "17" 2021-09-14
OpenJDK Runtime Environment Homebrew (build 17+0)
OpenJDK 64-Bit Server VM Homebrew (build 17+0, mixed mode, sharing)
[I] ➜ jdk 1.8
JAVA_HOME switched to '/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home'.
- 如果项目采用 Maven,指明特定版本:
<properties>
<java.version>8</java.version>
</properties>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>14</release>
<compilerArgs>
<arg>--enable-preview</arg>
</compilerArgs>
<forceJavacCompilerUse>true</forceJavacCompilerUse>
<parameters>true</parameters>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>--enable-preview</argLine>
</configuration>
</plugin>
如果是过渡版本,如 15,加入"enable-preview" 才能开启过渡版本中“非”默认的新特性。