1. 获取并安装多个版本的 jdk
点击如下链接,你可以分别获取到:
其中某些版本的 macOS 系统上自带 jdk1.6。如果没有的话,点击上面的链接从苹果官网下载,注意 oracle 官网不提供 jdk1.6 for macOS,只有 Linux 和 Windows 版本。
2. 修改系统环境变量,以自如的切换多个版本的 jdk
vi ~/.bash_profile 并填写下文内容
source ~/.bash_profile // 刷新环境变量
java -version // 查看当前的 jdk 版本
需要填写的内容为:
# 设置自带的 jdk1.6
export JAVA_6_HOME=`/usr/libexec/java_home -v 1.6`
# 设置 jdk1.7
export JAVA_7_HOME=`/usr/libexec/java_home -v 1.7`
# 设置 jdk1.8
export JAVA_8_HOME=`/usr/libexec/java_home -v 1.8`
# 默认 jdk 使用1.6版本
export JAVA_HOME=$JAVA_6_HOME
# alias 命令动态切换 jdk 版本
alias jdk6="export JAVA_HOME=$JAVA_6_HOME"
alias jdk7="export JAVA_HOME=$JAVA_7_HOME"
alias jdk8="export JAVA_HOME=$JAVA_8_HOME"
每次使用 jdk6、jdk7、jdk8 命令切换 jdk 版本时,都可以输入 java -version
来查看是否已经成功。
3. 原理
当你安装 jdk 完成,进入 /Library/Java/JavaVirtualMachines
目录你会看到相应 jdk 文件夹的存在。当你安装了多版本 jdk 时,它们同时存在于这个目录下。
那么你使用的 java -version
做了什么?我们一步一步追踪
➜ ~ which java // 使用 `which java` 得到 `/usr/bin/java`
/usr/bin/java
➜ ~ ll /usr/bin/java // 使用 `ll /usr/bin/java` 得到 `.../Current/Commands/java`
lrwxr-xr-x 1 root wheel 74B 10 9 17:53 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
➜ ~ cd /System/Library/Frameworks/JavaVM.framework/Versions
➜ Versions ls // 在这里,有苹果维护的多个 jdk 版本
1.4 1.5 1.6 A CurrentJDK
1.4.2 1.5.0 1.6.0 Current
➜ Versions pwd
/System/Library/Frameworks/JavaVM.framework/Versions
➜ Versions ll
total 64
lrwxr-xr-x 1 root wheel 10B 10 9 17:53 1.4 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10B 10 9 17:53 1.4.2 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10B 10 9 17:53 1.5 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10B 10 9 17:53 1.5.0 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10B 10 9 17:53 1.6 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10B 10 9 17:53 1.6.0 -> CurrentJDK
drwxr-xr-x 10 root wheel 340B 10 9 17:53 A
lrwxr-xr-x 1 root wheel 1B 10 9 17:53 Current -> A
lrwxr-xr-x 1 root wheel 52B 10 9 17:53 CurrentJDK -> /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents
可见苹果公司在开发 macOS 时已经内置了 jdk 版本管理的功能。它也提供了相应的 command line 工具。使用 /usr/libexec/java_home
即可直接查看当前的 $JAVA_HOME
➜ ~ /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home
➜ ~ /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
1.8.0_102, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_102.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
/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home
➜ ~ /usr/libexec/java_home -v 1.6
/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
➜ ~ /usr/libexec/java_home -v 1.7
/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
➜ ~ /usr/libexec/java_home -v 1.8
/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home
所以,我们在 .bash_profile
文件中加入 $JAVA_HOME 的动态设置,就可以自如的切换多个 jdk 版本了
关于为什么使用 .bash_profile
文件,你可能要参考如下内容了解:
4. 为什么会有管理多个 jdk 的需求?
以我自己为例好了,比如我平时做 Android 或者 Java 开发,都是指定了某个 jdk 版本的,例如 1.7。因为它支持了足够多的特性。然而,我有的时候需要使用某个低版本的软件比如 Charles,它竟然要求运行在 java1.6 环境下,没错,有些软件就是会有这样的依赖。这个时候怎么办呢,其实让系统同时存在多个 jdk,需要的时候进行切换就可以了。
参考: