Java SDK 多版本管理

本贴最后更新于 1260 天前,其中的信息可能已经时移世改

根据 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 版本,一行命令快速切换环境,无需重复配置环境变量。

本文主要介绍了以下四种工具方式:

  1. SDKMan,目前在用
  2. jEnv
  3. Jabba
  4. 自定义脚本

环境准备

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
#出现以下弹框,说明清理干净

vnEyhj

🀇SDK

nAgnqG

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

bjtAgJ

使用 SDK

所有命令请参见:https://sdkman.io/usage

sdk list //查看支持的软件

支持的软件库:Ant、AsciidoctorJ、Bpipe、BTrace、Ceylon、Concurnas、CRash、CUBA、CXF、Gaiden、Gradle profiler、Grails、Groovy、http4k、Infrastructor、java、JBakeJ'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

guUhaK

卸载 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

UMr0UR

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

参考:https://sourl.cn/uTzSpD

🀉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
关于博主:坐标广州,喜欢折腾各种东西的工程师,如有问题探讨可以直接下方留言。
声援博主:如果您觉得文章对您有帮助,可以评论、订阅、收藏。您的鼓励是博主的最大动力!

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3186 引用 • 8212 回帖 • 1 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    285 引用 • 728 回帖
  • 编程语言
    17 引用 • 36 回帖
  • 软件工程
    29 引用 • 81 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...