## 修改系统环境变量,以自如的切换多个版本的 jdk ```bash vi ~/.bash_profile 并填写下文内容 source ~/.bash_profile // 刷新环境变量 java -version // 查看当前的 jdk 版本 ``` 需要填写的内容为: ```bash # 设置自带的 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 来查看是否已经成功。 ## 原理 当你安装 jdk 完成,进入 `/Library/Java/JavaVirtualMachines` 目录你会看到相应 jdk 文件夹的存在。当你安装了多版本 jdk 时,它们同时存在于这个目录下。 那么你使用的 `java -version` 做了什么?我们一步一步追踪 ```bash ➜ ~ 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 ```bash ➜ ~ /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` 文件,你可能要参考如下内容了解: - [Environment variables](https://wiki.archlinux.org/index.php/environment_variables) - [What's the difference between .bashrc, .bash_profile, and .environment?](http://stackoverflow.com/questions/415403/whats-the-difference-between-bashrc-bash-profile-and-environment) ## 为什么会有管理多个 jdk 的需求? 以我自己为例好了,比如我平时做 `Android` 或者 `Java` 开发,都是指定了某个 jdk 版本的,例如 1.7。因为它支持了足够多的特性。然而,我有的时候需要使用某个低版本的软件比如 `Charles`,它竟然要求运行在 `java1.6` 环境下,没错,有些软件就是会有这样的依赖。这个时候怎么办呢,其实让系统同时存在多个 jdk,需要的时候进行切换就可以了。 参考: - [How to Set $JAVA_HOME environment variable on Mac OS X](https://www.mkyong.com/java/how-to-set-java_home-environment-variable-on-mac-os-x/) - [Important Java Directories on Mac OS X —— By Apple.com](https://developer.apple.com/library/content/qa/qa1170/_index.html) - [What should I set JAVA_HOME to on OSX](http://stackoverflow.com/questions/1348842/what-should-i-set-java-home-to-on-osx) - 作者:laberat - 链接:http://www.jianshu.com/p/af79ae7f732c - 來源:简书 - 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。