根据 JRebel 的调查报告显示,58% 的开发人员依旧使用 Java 8。虽然,近半同行依旧坚守这 Java 8 ,但是,Java 8 以后,6 个月更新一次,目前最新的 Java 12 已经发布, Java 11 已成为 LTS 版本。所以,紧跟时代潮流,不断学习,是开发者基本的素质(我学不懂啊),要体验新特性,就需要安装不同的 JDK,此时,电脑就有多套环境了,那学习管理 JDK 环境的正确姿势是很有必要的。
☕ Java SDK 多版本管理
很多中间件/框架(比如 Dubbo)需要兼容多个 JDK 版本,开发、测试时需要不断切换版本,通过
JAVA_HOME
手动修改让人痛苦不堪。之前了解到 Node.js 有很多版本管理工具,例如 nvm,通过 nvm 切换 Node.js 版本只需要一个命令,非常方便高效,幸运的是 Java 也有类似工具或方式来管理多个 JDK 版本,一行命令快速切换环境,无需重复配置环境变量。
本文主要介绍了以下四种工具方式:
- SDKMan,目前在用
- jEnv
- Jabba
- 自定义脚本
环境准备
Mac BigSur 11.1
windows 下暂未实验,请自行搜索
清理已有的环境
#移除JDK
sudo rm -rf /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk
#移除其他插件
sudo rm -rf /Library/PreferencePanes/JavaControlPanel.prefPane
sudo rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
sudo rm -rf /Library/LaunchAgents/com.oracle.java.Java-Updater.plist
sudo rm -rf /Library/PrivilegedHelperTools/com.oracle.java.JavaUpdateHelper
sudo rm -rf /Library/LaunchDaemons/com.oracle.java.Helper-Tool.plist
sudo rm -rf /Library/Preferences/com.oracle.java.Helper-Tool.plist
#验证
java --version
#出现以下弹框,说明清理干净
🀇SDK
SDKMAN!是用于在大多数基于 Unix 的系统上管理多个软件开发套件的并行版本的工具。它提供了方便的命令行界面(CLI)和 API,用于安装,切换,删除和列出候选人。它以前被称为 Groovy enVironment Manager GVM,它受到了非常有用的 RVM 和 rbenv 工具的启发,而 Ruby 社区广泛使用了 RVM 和 rbenv 工具。
安装 SDK
#默认命令行安装,安装位置在:$HOME/.sdkman
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
#自定义安装
export SDKMAN_DIR="/usr/local/sdkman" && curl -s "https://get.sdkman.io" | bash
#验证
sdk version
使用 SDK
所有命令请参见:https://sdkman.io/usage
sdk list //查看支持的软件
支持的软件库:Ant、AsciidoctorJ、Bpipe、BTrace、Ceylon、Concurnas、CRash、CUBA、CXF、Gaiden、Gradle profiler、Grails、Groovy、http4k、Infrastructor、java、JBake、J'Bang、Karaf、Kotlin、Kscipt 、Lazybones、Leiningen、Maven、Micronaut、sbt、Scala、Spark、Spring Boot、Sshoogr、Vert.x、VisualVM
#查看 java 相关的版本
sdk list java
#安装软件语法
# sdk install 软件 你想安装的版本(sdk default java IDENTIFIER)
sdk install java 8.0.265.hs-adp # 安装 jdk8
sdk install java 12.0.2.hs-adpt #安装 jdk12
# 如果你是通过 brew 安装了 JDK,则只需纳入 SDK 管理即可
sdk install java JDK8 /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
sdk install java JDK12 /Library/Java/JavaVirtualMachines/adoptopenjdk-12.jdk/Contents/Home
sdk install java JDK14 /Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home
#---------------------------------------------------------------
#卸载软件语法
# sdk uninstall 软件 软件版本
sdk uninstall java 8.0.265.hs-adp
#查看软件现有版本
sdk current java
#查看所有本地包的当前版本
sdk current
#升级
sdk upgrade java
sdk upgrade
#自我升级
skd selfupdate
#强制重新安装
sdk selfupdate fore
#### 切换 JDK 版本三种方式 🔽 将 Java 版本设置为默认版本 sdk default java JDK8
🔽 仅将 Java 版本用于当前终端会话 sdk use java 14.0.2-oracle
🔽 输入目录时激活特定的 Java 版本 sdk env init
打开 IDEA,可以看到,自动检测到用 sdkman 安装的 jdk
卸载 SDK
#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓卸载SDk↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
$ tar zcvf ~/sdkman-backup_$(date +%F-%kh%M).tar.gz -C ~/ .sdkman
$ rm -rf ~/.sdkman
//最后打开你的 .bashrc、.bash_profile 和/或者 .profile,找到并删除下面这几行。
#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
[[ -s "/home/dudette/.sdkman/bin/sdkman-init.sh" ]] && source "/home/dudette/.sdkman/bin/sdkman-init.sh"
##↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑卸载完成↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
🀈 使用 jEnv
jEnv 是管理工具,不具有安装功能,所以,需要先安装,在用 jEnv 管理环境,安装使用 brew
2019 年 6 月 brew 要从 AdoptOpenJDK 安装 JDK:
安装
#安装jEnv
brew install jEnv
#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 将下面配置加入.bash_profile ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
# To enable shims and autocompletion add to your profile:
if which jenv > /dev/null; then eval "$(jenv init -)"; fi
# To use Homebrew's directories rather than ~/.jenv add to your profile:
export JENV_ROOT=/usr/local/opt/jenv
#↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
使用
# 利用 brew 安装jdk
brew tap homebrew/cask-versions
brew update
brew cask install adoptopenjdk8
brew cask install adoptopenjdk9
brew cask install adoptopenjdk10
brew cask install adoptopenjdk11
brew cask install adoptopenjdk12
#安装路径在:/Library/Java/JavaVirtualMachines
#展示所有的jdk版本
/usr/libexec/java_home -V
#管理JDK,语法,jenv add <jdk_path>
jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-12.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home
# 如果遇到:ln: /usr/local/opt/jenv/versions/oracle64-1.7.0.51: No such file or directory
## 参考:https://github.com/jenv/jenv/wiki/Trouble-Shooting
//使用
jenv versions //展示所有环境
jenv global 1.8 //相当于设置环境变量
jenv local 10.0 //项目级别的jdk
//删除版本(只是删除链接)
jenv remove xxx
🀉Jabba
Java Version Manager inspired by nvm (Node.js). Written in Go.
The goal is to provide unified pain-free experience of installing (and switching between different versions of) JDK regardless of the OS (macOS, Linux x86/x86_64/ARMv7+, Windows x86_64).
安装
curl -sL https://github.com/shyiko/jabba/raw/master/install.sh | bash && . ~/.jabba/jabba.sh
用法
# list available JDK's
jabba ls-remote
# you can use any valid semver range to narrow down the list
jabba ls-remote zulu@~1.8.60
jabba ls-remote "*@>=1.6.45 <1.9" --latest=minor
# install Oracle JDK
jabba install 1.15.0
# install Oracle Server JRE
jabba install sjre@1.8
# install Adopt OpenJDK (Hotspot)
jabba install adopt@1.8-0
# install Adopt OpenJDK (Eclipse OpenJ9)
jabba install adopt-openj9@1.9-0
# install Zulu OpenJDK
jabba install zulu@1.8
jabba install zulu@~1.8.144 # same as "zulu@>=1.8.144 <1.9"
# install IBM SDK, Java Technology Edition
jabba install ibm@1.8
# install GraalVM CE
jabba install graalvm@1.0-0
# install OpenJDK
jabba install openjdk@1.10-0
# install OpenJDK with Shenandoah GC
jabba install openjdk-shenandoah@1.10-0
# install from custom URL
# (supported qualifiers: zip (since 0.3.0), tgz, tgx (since 0.10.0), dmg, bin, exe)
jabba install 1.8.0-custom=tgz+http://example.com/distribution.tar.gz
jabba install 1.8.0-custom=tgx+http://example.com/distribution.tar.xz
jabba install 1.8.0-custom=zip+file:///opt/distribution.zip
# uninstall JDK
jabba uninstall zulu@1.6.77
# link system JDK
jabba link system@1.8.72 /Library/Java/JavaVirtualMachines/jdk1.8.0_72.jdk
# list all installed JDK's
jabba ls
# switch to a different version of JDK (it must be already `install`ed)
jabba use adopt@1.8
jabba use zulu@~1.6.97
echo "1.8" > .jabbarc
# switch to the JDK specified in .jabbarc (since 0.5.0)
jabba use
# set default java version on shell (since 0.2.0)
# this version will automatically be "jabba use"d every time you open up a new terminal
jabba alias default 1.8
🀊 使用自定义终端脚本
# 1. 安装所需的jdk版本
brew cask install homebrew/cask-versions/java8
brew update
brew cask install adoptopenjdk8
brew cask install adoptopenjdk9
brew cask install adoptopenjdk10
brew cask install adoptopenjdk11
brew cask install adoptopenjdk12
#安装路径在:/Library/Java/JavaVirtualMachines
#展示所有的jdk版本
/usr/libexec/java_home -V
#2. 编写脚本
//最简单但繁琐的方式
export JAVA_HOME=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
export JAVA_HOME=/Library/Java/JavaVirtualMachines/1.8.0.jdk/Contents/Home
//最佳实践
//------.bash_profile编辑开始--------
vi ~/.bash_profile
# JDK 6、JDK 8、JDK 12 的 export 命令
export JDK6_HOME="/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home"
export JDK8_HOME="/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home"
export JDK12_HOME="/Library/Java/JavaVirtualMachines/openjdk-12.0.1.jdk/Contents/Home"
//或者按以下方式
export JAVA_HOME=$(/usr/libexec/java_home -v14)
export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_11_HOME=$(/usr/libexec/java_home -v11)
export JAVA_14_HOME=$(/usr/libexec/java_home -v14)
# alias 命令链接到 export 命令
alias jdk6="export JAVA_HOME=$JDK6_HOME"
alias jdk8="export JAVA_HOME=$JDK8_HOME"
alias jdk12="export JAVA_HOME=$JDK12_HOME"
# 或者以下方式
alias java8='export JAVA_HOME=$JAVA_8_HOME'
alias java11='export JAVA_HOME=$JAVA_11_HOME'
alias java14='export JAVA_HOME=$JAVA_14_HOME'
#设置默认的JDK
export jdk8
#或者以下方式
export JAVA_HOME=$(/usr/libexec/java_home -v14)
//------.bash_profile编辑结束--------
:wq!
source ~/.bash_profile
//使用,在bash中输入 jdk6/jdk8/jdk12 回车,切换java环境变量
jdk6
标 题:Java SDK 多版本管理
作 者:bugless
出 处:http://bugless.site
创建时间:2021-04-09 16:46:19
关于博主:坐标广州,喜欢折腾各种东西的工程师,如有问题探讨可以直接下方留言。
声援博主:如果您觉得文章对您有帮助,可以评论、订阅、收藏。您的鼓励是博主的最大动力!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于