Java版本升级频繁下多版本管理:环境变量的轻松管理与使用
前言

近两年,Java 的版本升级较为频繁。在不久前,人们似乎刚刚掌握了 Java8,然而,当撰写本文之时,已经听闻了关于 java14 的消息。无论是想要尝试新特性,还是对新特性感到好奇,都可以关注 java14 的相关内容。
无论是因为项目升级,还是因为兼容需要,我们或许都得面对管理多个 Java 版本的状况。
另外,Oracle 从 Java11 起对用户协议进行了更改,规定任何商用行为都要收费。在撰写本文的时候,我们得知了“微软宣布加入 OpenJDK”这一消息,由于在某些方面竞争不过对方,所以选择了加入 OpenJDK。大家可以随意在网上搜索一下,就把它当作一个故事来了解就可以了。
配置单个 Java 的环境变量没什么技术难度。然而,当要管理多个 Java 版本时,反复配置环境变量是很枯燥的。并且,按照传统的配置方式,我们无法灵活地切换 Java 版本。
那要如何轻松管理与使用多个版本 Java?
多版本 Java 管理
显然,我们并非是第一个遭遇这种困境的人。我所知晓的现有的方案有以下三种:
本文主要说明怎样借助 sdkman 来突破我们所处的困境,以利于我们灵活地对 Java 进行配置和使用。
sdkman 介绍
并且是管理这些工具包的并行版本。
它提供了一个便捷的命令行接口(CLI)以及 API,可用来进行安装、切换、删除和列出候选对象的操作。在本文中,主要是以管理 Java 为例来阐释 sdkman 的使用方式。
sdkman 安装
在类 unix 平台上安装 sdkman 很容易。它能在 Mac OSX 上顺利安装,也能在 Linux 上顺利安装,还能在 WLS 上顺利安装,能在 Cygwin 上顺利安装,能在 Solaris 上顺利安装,能在 FreeBSD 上顺利安装,并且支持 Bash shell 和 ZSH shell。
只需打开一个新终端机并输入:
使用 curl 命令并加上 -s 参数,访问 "https://get.sdkman.io" 这个地址,然后通过管道将其输出传递给 bash 进行处理。
按照相应的指令提示,完成相应的操作后继续输入:
将“$HOME/.sdkman/bin/sdkman-init.sh”这个文件的源加载进来。
到这里我们就可以验证 sdk 的安装版本了:
$ sdk version
上图红色框标记显示出我当前的 sdkman 版本。每次执行 sdk version 命令时,都会对是否有新版本进行检查。如果想要更新,输入 y 即可。
有些系统的发行版本没有包含 zip 以及 unzip 。如果在安装的时候遇到了相关的错误,那么可以输入下面这些命令来安装 zip 和 unzip 。
使用 sudo 命令来安装 zip 和 unzip 软件包,具体是通过 apt-get 命令进行安装操作。
从上面的安装命令能看出,sdkman 通常的安装路径在$HOME/.sdkman 处。同时,我们具备自定义安装路径的能力,只要对 SDKMAN_DIR 变量赋予相应的值即可。
导出 SDKMAN_DIR 为 "/usr/local/sdkman" ,然后通过 curl 以静默模式获取 "https://get.sdkman.io" 的内容,并将其通过管道传递给 bash 来执行相关操作。
到这里 sdkman 的安装就结束了,我们来看看如何使用
sdkman 使用教程
在命令行中学习一个新的东西,自然是查看它的帮助命令,具体操作是输入:
$ sdkman help
感觉将上图按照颜色进行区分内容之后,sdkman 的使用说明就结束了。我们依据上面的图来详细地说明一下使用教程。
sdk list
先来输入:
$ sdk list
绿色的标记代表着 sdkman 集成的所有可用的 candidate。按下回车“enter”按键后,就能看到更多可用的 candidate。
我们指定 candidate,输入:
$ sdk list java
从上图能看到所有 java 可用的版本。这些版本有其对应的标识和状态。我已经安装了 java 12 以及 java 11。
有了这些信息作为铺垫之后,我们就能够安装 sdkman 内置的任意软件开发包了。接下来以 java 为例继续进行相关操作。
sdk install
查看 sdkman help 命令的输出后,通过使用 install 命令,我们接着安装一个 Java 最新的 13.0.1.j9 版本。
从上图能够看出,绿色标记的内容属于 list 命令结果里的 version 值。然而,该值存在报错且不可用,只有输入 indentifier 编号,才能够正常进行下载。在此,需要引起注意。
安装完后,status 就会编程 installed 状态
sdk current
当安装了多个版本的 java 时,我们输入以下命令来获取当前正在使用的 candidate 版本。
$ sdk current java
sdk use
了解了当前使用版本,如果我们想切换到其他版本, 可以输入:
$ sdk use java 12.0.2.j9-adpt
注意️: 这里同样是指定的 indentifier 的值
sdk default
如果我们想指定某个版本为默认版本,可以输入:
sdk 的默认 Java 版本是 jdk1.8.0_162.jdk 。
注意️: 这里同样是指定的 indentifier 的值
sdk uninstall
当我们想卸载某个版本可以输入:
卸载 Java 12.0.2.j9-adpt 的 sdk
注意️: 这里同样是指定的 indentifier 的值
sdk upgrade
如果我们想升级某个 candidate,可以输入:
$ sdk upgrade java
sdk flush
使用 sdkman 后,随着时间的增长,会逐渐产生大量的缓存内容。我们可以输入相关指令来清理广播消息。
$ sdk flush broadcast
清理下载的 sdk 二进制文件,因为长时间使用后进行清理,能够节省出很多空间。
$ sdk flush archives
清理临时文件内容:
$ sdk flush temp
到这里,sdkman 的基本使用就已经介绍完毕了。实际上,这些命令不必着急,当想不起来的时候,执行 sdk help 命令就可以临时查看。
sdkman 卸载
如果我们不再喜欢 sdkman 了,那么我们能够很轻松地将它卸载掉。我们可以通过特定的操作来实现卸载 sdkman 的目的,这种操作并不复杂,能够让我们顺利地完成卸载工作。
在 ~/ 目录下使用 tar 命令进行压缩操作,以 gzip 格式进行压缩,使用 zcvf 参数,将 ~/ 目录下的.sdkman 文件夹及其所有内容打包成一个名为 ~/sdkman-backup_$(date +%F-%kh%M).tar.gz 的压缩文件。 $ rm -rf ~/.sdkman
首先打开你的.bashrc 文件,接着打开.bash_profile 文件,并且打开/或者.profile 文件,然后在这些文件中找到并删除下面这几行。
SDKMAN 要正常工作,这必须放在文件的末尾! 如果[-s "/home/dudette/.sdkman/bin/sdkman-init.sh"]成立,那么就执行 source "/home/dudette/.sdkman/bin/sdkman-init.sh"
我使用的是 zshrc,找到名为.zshrc 的文件,然后将其上面的内容删除掉就可以了。
在这里,关于基于 Unix 系统的 sdkman 的安装、使用及下载都已介绍完毕,现在可以开始动手尝试了。相信有很多小伙伴使用的是 Windows 系统,除了 jenv 之外,sdkman 和 Jabba 都有针对 Windows 用户的解决方案。
sdkman windows 解决方案
sdkman 官网首页为 windows 用户提供了解决方案,小伙伴们可找到如下位置进行查看。
我看了一下这个过程,它很简单。因为我手头没有 windows 电脑,所以这个事情请小伙伴们自行去尝试吧。如果有问题,欢迎大家留言。
灵魂追问
你正在使用的 Java 版本是何种呢?有没有去跟随新的版本而尝试更多的新特性呢?你的灯是否还亮着呢?
趣味地原创解析 Java 技术栈的问题,把复杂的问题进行简化,把抽象的问题以图形化的方式落实。
如果你对我的专题内容有兴趣,或者想要抢先看到更多内容,那么欢迎你来访问我的博客。