如何在一台计算机上安装多个 JDK 版本

前言

对于使用 Java 语言开发的朋友可能会遇到这种情况,有时想学习和探索 Java 的最新版本提供的一些新特性,比如 Java 11,但你无法将其安装在自己的计算机上,因为你的团队正在使用比这个旧的版本(我们目前用的 Java 8),你并不想影响目前的项目。或者你目前是在维护和开发多个项目,而这些不同的项目使用的 JDK 版本不一样,比如那些维护的老项目使用的是 JDK 8,而新项目你打算使用比较新的版本 JDK 11,以上这些情况都需要在计算机上安装多个 JDK,并且应该能够在多个版本之间方便快速的切换。今天要介绍的主角 SDKMAN 可以很好的解决上面这种问题,它提供了在同一台计算机上对多个版本的开发工具包管理。需要注意的是:这个工具只适用于类 Unix 的系统(比如:Mac OSX、Linux、Cygwin、Solaris、FreeBSD 等)。

SDKMan 简介

直接引用 SDKMan 官网上的介绍如下:

SDKMAN! is a tool for managing parallel versions of multiple Software Development Kits on most Unix based systems. It provides a convenient Command Line Interface (CLI) and API for installing, switching, removing and listing Candidates.

简单来说就是其提供了管理多个版本开发工具包的能力,同时也提供了一些命令行接口让我们方便安装、版本切换、版本移除和显示版本列表。关于 SDKMan 还有几个要点如下:

  1. SDKMan 是由开源社区开发的,免费使用,。
  2. SDKMan 是用 bash 编写的,它只需要您的系统上安装了 curlzip / unzip 命令即可。
  3. SDKMan 可以为 JVM 安装大约 29 个软件开发包,比如 JavaGroovyScalaKotlinGradleMavenSparkSpring Boot 等。
  4. SDKMan 可以自动处理帮我们配置 *_HOME(e.g.:JAVA_HOME)PATH 环境变量,因此我们不需要担心切换版本后这些环境变量的设置。

安装 SDKMan

SDKMan 可以运行在任何类 Unix 系统上,我们只需要在命令行输入以下命令即可安装:

curl -s "https://get.sdkman.io" | bash
install-sdkman.png

然后执行以下命令,加载文件 sdkman-init.sh 到当前环境,执行完该命令之后我们可以通过 sdk version 来验证是否安装成功,同时还可以通过 sdk help 命令显示有关 sdk 命令用法和帮助(PS: 对于使用 Windows 环境的朋友可以安装 Cygwin 或 Git Bash 运行以上命令)。

source "$HOME/.sdkman/bin/sdkman-init.sh"
verify-sdkman-install.png

使用 SDKMan 安装 JDK

前面已经介绍过,SDKMan 支持多达大约 29 个软件开发包管理,我们也可以使用 sdk list 命令来查看支持的完整列表,本文主要介绍 Java 相关的内容,可以通过命令 sdk list java 来查看支持安装的 Java 版本。

sdk-list-java.png

使用以下命令安装 Java 11

sdk install java 11.0.7.hs-adpt

该命令会花费一些时间,因为它会在我们的计算机上下载对应版本的 JDK,执行完成之后 SDKman 会自动给我们配置好 JAVA_HOMEPATH 等环境变量,可以通过 Java -version 命令验证。

sdk-install-jdk-11

现在,如果检查 Java 版本和 JAVA_HOME 环境变量,可以看到当前 Java 的版本已更新为 11.0.7

java-version-verify

可以使用以下命令来设置默认使用的 JDK 版本。

sdk default java 11.0.7.hs-adpt

将 SDKMan 指向已安装 Java 版本

如果在你安装 SDKMan 之前本地电脑已经安装了 JDK 版本,默认是无法识别到的,那么你需要进行以下配置才能让 SDKMan 识别已安装的版本,首先,第一步你要先找到你的 Java 安装目录,我本地 Mac 的安装目录是 /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk,然后使用命令 ln -s 来为 Java 安装目录建立符号链接。

point-sdkman-existing-installd-version.png

多个 JDK 版本切换示例

SDKMan 提供了命令 sdk use java <version_want_to_use> 在多个版本之间进行切换,使用 sdk use java jdk1.8.0_181.jdk 命令来使用之前本地安装的 Java 8

sdk-use-jdk8.png

使用命令 sdk use java 11.0.7.hs-adpt 来设置版本为 Java 11

sdk-use-java11

需要注意的是:使用命令 sdk use java <version> 只在当前会话有效,如果你关闭终端并再次打开它,则将使用以前安装的版本,不会改变你本地使用的版本,此时可以使用 sdk default java <version> 来设置永久生效。

如何卸载指定的 JDK 版本

如果你想要卸载任何已安装的 JDK 版本,比如: 11.0.7.hs-adpt,可以使用以下命令卸载:

sdk uninstall java 11.0.7.hs-adpt

此时,如果你想再次安装之前通过 SDKMan 卸载的版本,此时不会再次重新下载,会提示 Found a previously downloaded java 11.0.7.hs-adpt archive. Not downloading it again...,因为之前删除操作并没有真正的从你计算机上删除源压缩包文件。

IntelliJ IDEA 使用 SDMan 安装 JDK

SDKMan 所有安装的 JDK 都放在目录 .sdkman/candidates/java/,你可以在你当前用户的 home 文件夹下面看到该文件夹(注意是隐藏文件夹)。

show-sdkman-directory.png

IntelliJ IDEA 中打开任何一个 Java 项目后,您可以按 Command + : 快捷键打开项目结构窗口,在 Project SDK 模块选择新建一个 JDK 后输入你需要的 JDK 版本在 SDKMan 中的路径即可。

idea-set-jdk-version.png

因为 .sdkman 是隐藏文件夹不太方便查找,可以使用以下命令创建一个非隐藏文件夹指向它。

ln -s ~/.sdkman ~/sdkman
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343