# SDKMan Tips

[![SDKMAN! logo](https://sdkman.io/assets/img/sdk-man-small-pattern.svg align="center")](https://sdkman.io/)

## What is the SDKman

[https://sdkman.io/](https://sdkman.io/)

在使用之前, 先介紹一下 SDKman 要解決什麼問題.

在 JVM 一直有豐富的開發生態圈, Java, Groovy, Maven, Gradle, Spark, Flink, …, 隨著時間有可能需要在自己的開發環境上跑多種版本的 Java, Gradle, Maven, etc. 而 SDKman 就是解決這些版本衝突的管理工具.

切換版本示範

```apache
# install java 21
sdk install java 21.0.5-sem
# use java 21
sdk use java 21.0.5-sem

# install maven
sdk install maven 3.9.9
# use maven
sdk use maven 3.9.9
```

使用起來非常類似 [NVM](https://github.com/nvm-sh/nvm) (Node Version Manager) 管理工具.

但他有一個很大的缺點就是目前只支援 UNIX (MacOS) 作業系統.

## 安裝

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

## setup to current shell
source "$HOME/.sdkman/bin/sdkman-init.sh"

## testing sdk command is work
sdk version
```

## 常用的設定

我的開發工具目前還是以 IntelliJ 為主, 為了要讓 CLI 與 IntelliJ 的環境一致, 通常需要到專案裡面設定 Java SDK.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1734353731401/b861a6ef-400d-4c4c-86cc-67b02ccb085f.png align="center")

但因為 `/.sdkman` 是隱藏式的目錄, 所以我會透過 soft link 的方式, 建立一個指向目前 sdkman 切換的 java 版本.

soft link 可以簡單理解為類似 windows 作業系統下的捷徑, 就是一個指向 sdkman 當下切換 JDK 版本的捷徑.

```bash
# 將 sdkman 當前的 java 目錄, 設置一個 JAVA_HOME link 
ln -s ~/.sdkman/candidates/java/current JAVA_HOME

# 將 sdkman 當前的 maven 目錄, 設置一個 MAVEN_HOME link
ln -s ~/.sdkman/candidates/maven/current MAVEN_HOME

# 將 sdkman 當前的 gradle 目錄, 設置一個 GRADLE_HOME link
ln -s ~/.sdkman/candidates/gradle/current GRADLE_HOME
```

這樣就不用暴露整個 `~/.sdkman` , 而 intelliJ 也能跟隨你切換好的 SDK 去做設置.
