使用SDKMAN进行高效便捷管理SDK

在开发项目时以及阅读源码时,经常会需要不同的SDK,一般来说都需要去官网或者其他地方找SDK安装包,然后安装好后再修改一堆环境变量,极其麻烦。这里提供一个SDK管理工具,支持多个平台,支持多种SDK,管理过程高效便捷。

工具介绍

这个管理工具名叫SDKMAN,可以用来管理多个软件开发工具包的并行版本,提供了一套方便的命令,进行安装、切换和删除候选版本,类似于Python的Anaconda,NodeJs的Nvm。这个管理工具支持多个来源的JDK版本以及多种SDK,这里列举部分工具支持的SDK:

  • Apache ActiveMQ
  • Apache JMeter
  • Kotlin
  • Maven
  • Ant
  • Flink
  • Gradle
  • Groovy
  • Scala
  • Hadoop
  • JDK
  • JDK Mission Control
  • Spark
  • Spring Boot
  • Apache Tomcat
  • VisualVM
  • ……

更多的可以参考官方文档支持的SDK列表以及支持的JDK列表。从上面可以看出支持的SDK列表还是很多的。

工具安装:

管理工具支持Windows、MacOS、Linux、WSL、Cygwin、Solaris 和 FreeBSD操作系统。Windows系统上SDKMAN的安装较为复杂,其他系统安装特别简单。

其他系统安装SDKMAN

先演示一下非Windows系统上SDKMAN的安装。SDKMAN的安装特别简单,只需要打开终端,敲一行命令就可以了。

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

SDKMAN默认安装目录是$HOME/.sdkman。如果要指定安装位置,也可以执行命令前添加一个环境变量,比如设置安装目录为/opt/sdkman,可以使用如下命令进行安装:

export SDKMAN_DIR="/opt/sdkman" && curl -s "https://get.sdkman.io" | bash

安装过程如下所示:


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

                                -+syyyyyyys:
                            `/yho:`       -yd.
                         `/yh/`             +m.
                       .oho.                 hy                          .`
                     .sh/`                   :N`                `-/o`  `+dyyo:.
                   .yh:`                     `M-          `-/osysoym  :hs` `-+sys:      hhyssssssssy+
                 .sh:`                       `N:          ms/-``  yy.yh-      -hy.    `.N-````````+N.
               `od/`                         `N-       -/oM-      ddd+`     `sd:     hNNm        -N:
              :do`                           .M.       dMMM-     `ms.      /d+`     `NMMs       `do
            .yy-                             :N`    ```mMMM.      -      -hy.       /MMM:       yh
          `+d+`           `:/oo/`       `-/osyh/ossssssdNMM`           .sh:         yMMN`      /m.
         -dh-           :ymNMMMMy  `-/shmNm-`:N/-.``   `.sN            /N-         `NMMy      .m/
       `oNs`          -hysosmMMMMydmNmds+-.:ohm           :             sd`        :MMM/      yy
      .hN+           /d:    -MMMmhs/-.`   .MMMh   .ss+-                 `yy`       sMMN`     :N.
     :mN/           `N/     `o/-`         :MMMo   +MMMN-         .`      `ds       mMMh      do
    /NN/            `N+....--:/+oooosooo+:sMMM:   hMMMM:        `my       .m+     -MMM+     :N.
   /NMo              -+ooooo+/:-....`...:+hNMN.  `NMMMd`        .MM/       -m:    oMMN.     hs
  -NMd`                                    :mm   -MMMm- .s/     -MMm.       /m-   mMMd     -N.
 `mMM/                                      .-   /MMh. -dMo     -MMMy        od. .MMMs..---yh
 +MMM.                                           sNo`.sNMM+     :MMMM/        sh`+MMMNmNm+++-
 mMMM-                                           /--ohmMMM+     :MMMMm.       `hyymmmdddo
 MMMMh.                  ````                  `-+yy/`yMMM/     :MMMMMy       -sm:.``..-:-.`
 dMMMMmo-.``````..-:/osyhddddho.           `+shdh+.   hMMM:     :MmMMMM/   ./yy/` `:sys+/+sh/
 .dMMMMMMmdddddmmNMMMNNNNNMMMMMs           sNdo-      dMMM-  `-/yd/MMMMm-:sy+.   :hs-      /N`
  `/ymNNNNNNNmmdys+/::----/dMMm:          +m-         mMMM+ohmo/.` sMMMMdo-    .om:       `sh
     `.-----+/.`       `.-+hh/`         `od.          NMMNmds/     `mmy:`     +mMy      `:yy.
           /moyso+//+ossso:.           .yy`          `dy+:`         ..       :MMMN+---/oys:
         /+m:  `.-:::-`               /d+                                    +MMMMMMMNh:`
        +MN/                        -yh.                                     `+hddhy+.
       /MM+                       .sh:
      :NMo                      -sh/
     -NMs                    `/yy:
    .NMy                  `:sh+.
   `mMm`               ./yds-
  `dMMMmyo:-.````.-:oymNy:`
  +NMMMMMMMMMMMMMMMMms:`
    -+shmNMMMNmdy+:`


                                                                 
Now attempting installation...
Looking for a previous installation of SDKMAN...
Looking for unzip...
Looking for zip...
Looking for curl...
Looking for sed...
Installing SDKMAN scripts...
Create distribution directories...
Getting available candidates...
Prime the config file...
Installing script cli archive...
* Downloading...
######################################################################## 100.0%
* Checking archive integrity...
* Extracting archive...
* Copying archive contents...
* Cleaning up...

Set version to 5.18.1 ...
Set native version to 0.2.2 ...
Attempt update of interactive bash profile on regular UNIX...
Added sdkman init snippet to /opt/sdkman/.bashrc
Attempt update of zsh profile...
Updated existing /opt/sdkman/.zshrc



All done!


You are subscribed to the STABLE channel.

Please open a new terminal, or run the following in the existing one:

    source "/opt/sdkman/bin/sdkman-init.sh"

Then issue the following command:

    sdk help

Enjoy!!!

安装完成后,提示说要打开一个新的GitBash窗口就可以开始使用SDKMAN了,如果要在当前终端中使用,也可以使用source "/opt/sdkman/bin/sdkman-init.sh"命令重新加载环境变量。

这里就打开一个新的终端,然后验证下SDKMAN的版本,结果如下:

$ sdk version
SDKMAN 5.18.1

到这里为止,SDKMAN的安装就结束了。

Windows安装SDKMAN

Windows的安装比较特殊,由于SDKMAN是用bash编写的,因此需要存在bash环境,但是Windows又没有Bash环境,所以需要借助其他方式来实现。官网上提供了三种解决方案:

  • 安装Windows Subsystem for Linux (WSL)。并安装基本的工具链,包括bash、zip、unzip和curl(特殊情况需要tar和gzip)。
  • 安装Cygwin。并安装基本的工具链,包括bash、zip、unzip和curl(特殊情况需要tar和gzip)。
  • 使用Windows环境下的Git Bash。并安装基本的工具链,包括bash、zip、unzip和curl(特殊情况需要tar和gzip)。

作为一个程序员,GitBash是肯定会安装的,因此第三种方案看起来天然就是为我们打造的。这里使用第三种方式进行安装。安装和Linux安装基本一致,只不过需要在GitBash下使用命令。

GitBash安装并配置工具链

安装SDKMAN前需要安装GitBash,GitBash的安装直接去官网下载一个Windows版本的安装包,安装好就可以了。这里就不演示了。

安装好GitBash之后,需要补充下工具链,默认情况下GitBash缺少了zip命令,需要自行安装下,可以从这里下载安装包,然后将压缩包里面的bin\zip.exe解压到Git安装目录下的mingw\bin中。例如我的Git安装D:\Programs\Git目录,就需要将zip.exe解压到D:\Programs\Git\mingw\bin.exe

SDKMAN的安装

SDKMAN的安装参考上面的“其他系统安装SDKMAN”这一部分,没有啥区别。

Windows环境变量配置

这里演示一下使用SDKMAN安装JDK后,如何设置Windows环境变量。

和正常配置JDK一样,我们打开计算机系统属性,找到环境变量:

Windows环境变量配置—打开系统环境变量
Windows环境变量配置—打开系统环境变量

我的JDK安装到了D:\Programs\SdkMan\candidates\java中,在这个文件夹里面有SDKMAN安装的所有Java版本,每个版本一个文件夹,还有一个名为current的文件夹,这个文件夹是一个映射,指向的是SDKMAN上设置的当前Java版本对应的文件夹。因此如果我们要在SDKMAN切换版本的时候让Windows默认的版本也一起切换,将current文件夹的地址设置为JAVA_HOME,并将其子文件夹bin的路径添加到系统环境变量Path中即可。

在环境变量中,新建一个名为JAVA_HOME的系统变量,值为SDKMAN安装的JDK的目标路径的current文件夹。

使用SDKMAN进行高效便捷管理SDK
Windows环境变量配置—新建名为JAVA_HOME的系统变量

新建系统环境变量完成后,再编辑一下系统变量Path的值,添加一个值,值为%JAVA_HOME%\bin,然后保存。

Windows环境变量配置—编辑系统变量Path的值
Windows环境变量配置—编辑系统变量Path的值

之后我们打开新的控制台窗口,使用命令查看一下Java版本,就会发现已经正常识别了。

Microsoft Windows [版本 10.0.19045.2846]
(c) Microsoft Corporation。保留所有权利。

C:\Users\Developer>java -version
openjdk version "1.8.0_372"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_372-b07)
OpenJDK 64-Bit Server VM (Temurin)(build 25.372-b07, mixed mode)

此时我们再打开Git Bash进行按照和切换版本,Windows也可以正常识别。

相关命令的使用

相关命令的使用可以参考官方文档。这里以JDK为例,举一些简单的命令使用的例子。

JDK/SDK安装

可以使用sdk ls java命令查看所有安装的Java版本

$ sdk ls java
================================================================================
Available Java Versions for Cygwin
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
 Corretto      |     | 20           | amzn    |            | 20-amzn
               |     | 19.0.2       | amzn    |            | 19.0.2-amzn
               |     | 19.0.1       | amzn    |            | 19.0.1-amzn
               |     | 17.0.7       | amzn    |            | 17.0.7-amzn
               |     | 17.0.6       | amzn    |            | 17.0.6-amzn
…………(此处省略部分内容)
 Oracle        |     | 20.0.1       | oracle  |            | 20.0.1-oracle
               |     | 20           | oracle  |            | 20-oracle
               |     | 19.0.2       | oracle  |            | 19.0.2-oracle
               |     | 19.0.1       | oracle  |            | 19.0.1-oracle
               |     | 17.0.7       | oracle  |            | 17.0.7-oracle
               |     | 17.0.6       | oracle  |            | 17.0.6-oracle
               |     | 17.0.5       | oracle  |            | 17.0.5-oracle
 Temurin       |     | 20           | tem     |            | 20-tem
               |     | 20.0.1       | tem     |            | 20.0.1-tem
               |     | 19.0.2       | tem     |            | 19.0.2-tem
               |     | 19.0.1       | tem     |            | 19.0.1-tem
               |     | 17.0.7       | tem     |            | 17.0.7-tem
               |     | 17.0.6       | tem     |            | 17.0.6-tem
               |     | 17.0.5       | tem     |            | 17.0.5-tem
               |     | 11.0.19      | tem     |            | 11.0.19-tem
               |     | 11.0.18      | tem     |            | 11.0.18-tem
               |     | 11.0.17      | tem     |            | 11.0.17-tem
               |     | 8.0.372      | tem     |            | 8.0.372-tem
               |     | 8.0.362      | tem     |            | 8.0.362-tem
               |     | 8.0.352      | tem     |            | 8.0.352-tem
               |     | 8.0.345      | tem     |            | 8.0.345-tem
…………(此处省略部分内容)
================================================================================
Omit Identifier to install default version 17.0.7-tem:
    $ sdk install java
Use TAB completion to discover available versions
    $ sdk install java [TAB]
Or install a specific version by Identifier:
    $ sdk install java 17.0.7-tem
Hit Q to exit this list view
================================================================================

由于没有Oracle的Jdk8,我们可以使用OpenJdk代替,这里安装Temurin的JDK8:

$ sdk install java 8.0.372-tem

Downloading: java 8.0.372-tem
In progress...
######################################################################## 100.0%
Installing: java 8.0.372-tem
Done installing!

Setting java 8.0.372-tem as default.

安装完成后,会自动设置这个版本为默认版本。然后我们再次安装Temurin的JDK11:

$ sdk install java 11.0.19-tem

Downloading: java 11.0.19-tem
In progress...
######################################################################## 100.0%
Installing: java 11.0.19-tem
Done installing!

Setting java 11.0.19-tem as default.

安装完成后,会自动设置JDK8这个版本为默认版本。

JDK/JDK版本切换

可以使用sdk default命令将之前安装的JDK8设置为默认版本:

$ sdk default java 8.0.372-tem

Default java version set to 8.0.372-tem

此时再次查看JDK版本,会发现版本已经是JDK8了。

$ java -version
openjdk version "1.8.0_372"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_372-b07)
OpenJDK 64-Bit Server VM (Temurin)(build 25.372-b07, mixed mode)

JDK/SDK卸载

如果要卸载某个JDK版本,可以使用sdk uninstall命令卸载:

$ sdk uninstall java 11.0.19-tem

Uninstalling java 11.0.19-tem...

其他命令

如果要了解更多命令的使用,可以去官网Usage页面查看。

相关问题

切换JDK/SDK版本报错Device or resource busy

有的时候安装切换JDK/SDK版本会出现Device or resource busy的情况,相关报错信息如下:

$ sdk install gradle 6.9.4

Downloading: gradle 6.9.4

In progress...

######################################################################## 100.0%

Installing: gradle 6.9.4
Done installing!


Setting gradle 6.9.4 as default.
rm: cannot remove 'D:\Programs\SdkMan/candidates/gradle/current/lib/annotations-20.1.0.jar': Device or resource busy
rm: cannot remove 'D:\Programs\SdkMan/candidates/gradle/current/lib/ant-1.10.11.jar': Device or resource busy
rm: cannot remove 'D:\Programs\SdkMan/candidates/gradle/current/lib/ant-antlr-1.10.11.jar': Device or resource busy
rm: cannot remove 'D:\Programs\SdkMan/candidates/gradle/current/lib/ant-junit-1.10.11.jar': Device or resource busy
rm: cannot remove 'D:\Programs\SdkMan/candidates/gradle/current/lib/ant-launcher-1.10.11.jar': Device or resource busy


ln: failed to create symbolic link 'D:\Programs\SdkMan/candidates/gradle/current/6.9.4': No such file or directory

这是因为之前的默认JDK/SDK正在使用,占用了相关文件,需要退出对应的应用或Kill掉相关进程。然后再次手动执行版本切换,就可以正常切换了。

$ sdk default gradle 6.9.4

Default gradle version set to 6.9.4

#切换SDK版本报错File name too long

之前使用Gradle的时候,把Gradle依赖仓库放到了Gradle安装目录下,就导致了切换其他Gradle版本的时候报错目录太长了。这其实是自己设置不合理导致的,可以考虑将Gradle依赖安装目录设置到其他目录,然后删除Gradle安装目录下的仓库,就不会出现这个问题了。

$ sdk default gradle 5.6.2
ln: failed to create symbolic link 'D:\Programs\SdkMan/candidates/gradle/current' -> '5.6.2': File name too long

Default gradle version set to 5.6.2

原创文章,创作不易,版权所有,抄袭必究

作者:幽叶草。如若转载,需要先经过作者同意,并附上原文链接 https://blog.uusite.com/system/software/423.html

(0)
幽叶草的头像幽叶草
上一篇 2023年5月8日 下午11:57
下一篇 2023年3月31日 下午4:16

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注