Skip to main content

Mac 上安装 Java 多版本

·784 字·2 分钟
工具 & 生产效率 java

Java 现在是一年一个版本(每六个月就能获得新版本),加快迭代的速度,每一个版本将延续前一个版本的新特性,但只有 LTS(Long-Term-Support)版本得到长期维护,见下表:

Oracle SE

考虑到 Java 庞大的生态和生产环境,估计 Java8 还会呆很长一段时间,所以机器上得上多版本:

  1. 先看看 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 则是另一个可获得的(旧)版本

  1. 这时可以执行 brew install java 或者 brew install java11 安装

  2. 如果需要更多的版本选择,需要加入源 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
  1. 选择版本安装,例如:
[I] ➜ brew cask install adoptopenjdk8
  1. 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。

  1. 看看本机上所有安装的 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) 两个版本

  1. 切换不同的版本

把这段加入 .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'.
  1. 如果项目采用 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" 才能开启过渡版本中“非”默认的新特性。