本文介绍了环境管理工具SDKMAN,他可以辅助我们管理多个版本的JDK、gradle和maven环境,并可快捷切换。

1. 前言

在实际学习和工作中,我们经常会需要配置不懂JDK版本的环境,同时这些JAVA的项目有些使用了gradle管理依赖项,有些又使用的是maven,不同项目之间使用的工具链版本也不一定相同,这就需要我们安装不同版本的依赖工具。

如果完全依靠我们人工去安装不同版本的工具链并自己去选定工具所在目录和设置诸如JAVA_HOME环境变量,就很容易出错。大家都知道,编程开发这边很多纯命令行的工具是很难卸载干净的,纯靠自己人工管理,还非常容易把自己电脑上的环境弄得一团糟。

之前本站已经给大家引入过了不同版本python的管理工具uv,uv不仅可以管理不同版本的python,还可以帮我们代理python venv虚拟环境和依赖下载,方便我们快捷启动某个项目。

2. 下载安装

官网:https://sdkman.io/

安装sdkman非常简单。直接用如下命令就可以了:

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

需要注意的是,sdkman是对类unix系统设计的,所以并不支持windows。在mac上安装sdkman之前,需要先安装homebrew。

安装完毕了之后,需要执行一下这个source命令让sdkman生效(注意路径中的参数是你自己的用户名,sdkman的安装工具安装结束后会打印出这个source命令)

1
source "/Users/mothra/.sdkman/bin/sdkman-init.sh"

使用sdk help命令确定是否已经安装成功,后续的操作都是用sdk命令来执行。

3. 基本使用

3.1. 下载不同版本的工具

sdkman可以管理maven、gradle和JDK的版本,使用如下命令查看能够直接通过sdkman安装的版本

1
sdk list 工具类型

比如使用sdk list java就能得到可以安装的JDK版本

image.png

这里优先推荐安装亚马逊的JDK,因为其比较完善还免费商用。使用如下命令即可安装:

1
sdk install java 17.0.14-amzn

这里的下载源不在国内,所以下载的时候可能因为网络问题出现波动,你懂的~

下载gradle也是同理

1
2
sdk list gradle         # 查看可以安装的版本
sdk install gradle 7.5 # gradle没有不同的提供商,所以只需要版本号就行了

3.2. 选择不同版本的工具

选择工具有两个方式,一个是在当前终端临时生效,另外一个是全局生效(默认值)

1
2
sdk use 工具 工具版本
sdk default 工具 工具版本

比如我想在当前终端使用JDK17,那就使用如下命令。想全局设置就把use改成default即可。

1
sdk use java 17.0.14-amzn

3.3. 添加已有的JDK

如果在下载sdkman之前已经有JDK了(比如idea自动下载的JDK),而且后续还想使用这个JDK,要怎么做?

Python uv工具能自动扫描出已有的python解析器安装路径,但是sdkman没有扫描功能。

首先我们需要知道当前已经安装的JDK的位置在哪里,如果你之前配置过JAVA_HOME环境变量,可以直接使用如下命令找到它

1
/usr/libexec/java_home -V

比如我的mac上当前使用的是idea下载的JDK

1
2
3
4
❯ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
23.0.1 (arm64) "Oracle Corporation" - "OpenJDK 23.0.1" /Users/mothra/Library/Java/JavaVirtualMachines/openjdk-23.0.1/Contents/Home
/Users/mothra/Library/Java/JavaVirtualMachines/openjdk-23.0.1/Contents/Home

如果我们想用sdkman管理这个JDK,需要将这个home路径加到sdkman的管理目录~/.sdkman/candidates下。这个目录中会有sdkman安装的各类JDK,同时我们也可以在这个路径下添加软连接,把我们自己安装的JDK引入进来。

1
2
3
4
5
6
7
8
9
mkdir -p /Users/mothra/.sdkman/var/metadata  # 缓存目录
mkdir -p ~/.sdkman/candidates/java
cd ~/.sdkman/candidates/java
# 直接利用环境变量指向的路径,软连接到sdkman目录下
ln -s $JAVA_HOME 23.0.1-openjdk
# 刷新
sdk flush java
# 使用
sdk use java 23.0.1-openjdk

命令执行输出如下

1
2
3
4
5
6
7
8
~/.sdkman/candidates/java             
❯ ln -s $JAVA_HOME 23.0.1-openjdk

~/.sdkman/candidates/java
❯ sdk use java 23.0.1-openjdk
Setting java version 23.0.1-openjdk as default.

Using java version 23.0.1-openjdk in this shell.

刷新了之后,是可以在sdk list java的最底部看到我们添加的这个JDK的,其会被显示为Unclassified未分组状态

image.png

除了上面这种手动软连接的方式,更推荐的方式是直接使用install命令的第三个参数path来直接指定安装。注意确认你指定的jdk所在path是存在的!

1
2
3
❯ sdk install java 23openjdk $JAVA_HOME
Linking java 23openjdk to /Users/mothra/.sdkman/candidates/java/current
Done installing!

4. The end

到这里就结束啦,sdkman的基本使用就是上面的几个命令,很简单的操作,就解决了我们自己管理环境的种种麻烦。

不过需要注意的是,sdkman设置的环境只在终端里面生效,idea里面的项目jdk和gradle设置大概率不会跟着sdkman设置的版本走,还是需要在idea里面单独设置的!