SDKMAN 은 Software Development Kit MANager의 약자로써 유닉스 환경에서 여러 소프트웨어 개발 키트를 손쉽게 관리할 수 있는 CLI 도구이다. SDKMAN 설치와 사용법에 대해서 간단히 정리하고 가겠다.
SDKMAN Install
macOS, Linux 및 Windows(WSL) 과 같은 UNIX 환경에서 SDKMAN 설치는 매우 간단하다. BASH, ZSH 쉘 모두 호환이 된다.
$>curl -s "https://get.sdkman.io" | bash
$>source "$HOME/.sdkman/bin/sdkman-init.sh"
기본적으로 $HOME 경로 하위의 .sdkman 디렉터리에 설치된다.
설치 완료 후 bash 쉘을 사용하는 경우 $HOME/.bashrc 혹은 $HOME/.bash_profile 파일에, zsh 쉘을 사용하는 경우 $HOME/.zshrc 파일에 SDKMAN 초기화 스니펫이 추가된다.
#zshell 의 경우 .zshrc 파일에 추가된 초기화 스니펫
#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"
위 명령이 정상적으로 수행이 되면 설치가 완료된 것이다. 아래 명령을 통해서 버전 정보를 확인할 수 있다.
$>sdk version
SDKMAN!
script: 5.18.2
native: 0.4.2
Windows 환경에서 설치
윈도우 환경에서는 WSL 환경 혹은 Git Bash에서 설치가 가능하다.
- WSL 환경
- SDKMAN 설치하기 전에 Linux 용 Windows 하위 시스템 (WSL) 설치가 필요하다. WSL 설치 후 bash, zip, unzip, curl 패키지 설치가 필요하다.
- Git Bash 환경
- SDKMAN에 필요한 도구집합 (bash, zip, unzip, curl)을 갖추려면 MinGW로 보완을 해야 한다. 별로 추천하지 않는 듯하다. Cygwin 환경에서는 지원되지 않는다고 한다.
SDKMAN beta 채널
새로운 SDKMAN CLI 기능을 체험해 보고 싶다면 배타판을 설치하여 체험해 볼 수 있다.
$>curl -s "https://beta.sdkman.io" | bash
베타판 체험을 그만두고 싶다면 ~/.sdkman/etc/config 파일에서 sdkman_beta_channel 설정을 false로 변경 후 아래 명령을 실행한다.
sdk selfupdate force
SDKMAN Uninstall
1. 기존에 설치된 sdkman을 백업 후 제거 하고자 하는 경우 .sdkman 을 백업 후 .sdkman 디렉터리를 제거한다.
$>tar cvfpz ~/sdkman-backup_$(date +%F).tar.gz -C ~/ .sdkman
$>rm -rf ~/.sdkman
위 명령은 $HOME/.sdkman 디렉터리를 $HOME/sdkman-backup_yyyy-mm-dd.tar.gz 형식으로 파일을 압축하여 백업 후 $HOME/.sdkman 디렉터리를 삭제한다.
2. SDKMAN 설치시에 .bashrc 혹은 .zshrc 에 추가된 아래 SDKMAN 초기화 스니펫을 제거한다.
#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"
설치 디렉터리를 지정하여 SDKMAN 설치하기
SDKMAN 은 기본적으로 $HOME/.sdkman 에 설치되지만 다른 경로로 SDKMAN을 설치할 수 있다. SDKMAN 을 설치하기 전에 아래 명령으로 SDKMAN_DIR 환경 변수를 설치하고자 하는 디렉터리로 미리 세팅 후 설치를 진행한다.
$>export SDKMAN_DIR="/usr/local/sdkman" && curl -s "https://get.sdkman.io" | bash
위 명령은 /usr/local/sdkman 디렉터리에 sdkman을 설치한다.
SDKMAN 사용법
sdkman 은 CLI 자동 완성을 지원한다. sdk <tab> 키를 통해서 사용할 수 있는 명령 옵션을 확인할 수 있다.

설치 가능한 패키지 목록 조회
$>sdk list
설치 가능한 패키지 목록을 조회한다. 결과는 아래와 같이 출력된다.
================================================================================
Available Candidates
================================================================================
q-quit /-search down
j-down ?-search up
k-up h-help
--------------------------------------------------------------------------------
Apache ActiveMQ (Classic) (5.17.1) https://activemq.apache.org/
Apache ActiveMQ® is a popular open source, multi-protocol, Java-based message
broker. It supports industry standard protocols so users get the benefits of
client choices across a broad range of languages and platforms. Connect from
clients written in JavaScript, C, C++, Python, .Net, and more. Integrate your
multi-platform applications using the ubiquitous AMQP protocol. Exchange
messages between your web applications using STOMP over websockets. Manage your
IoT devices using MQTT. Support your existing JMS infrastructure and beyond.
ActiveMQ offers the power and flexibility to support any messaging use-case.
$ sdk install activemq
--------------------------------------------------------------------------------
Ant (1.10.13) https://ant.apache.org/
Apache Ant is a Java library and command-line tool whose mission is to drive
processes described in build files as targets and extension points dependent
upon each other. The main known usage of Ant is the build of Java applications.
Ant supplies a number of built-in tasks allowing to compile, assemble, test and
run Java applications. Ant can also be used effectively to build non Java
applications, for instance C or C++ applications. More generally, Ant can be
used to pilot any type of process which can be described in terms of targets and
tasks.
$ sdk install ant
--------------------------------------------------------------------------------
AsciidoctorJ (2.5.10) http://asciidoctor.org/
AsciidoctorJ is the official library for running Asciidoctor on the JVM. Using
AsciidoctorJ, you can convert AsciiDoc content or analyze the structure of a
parsed AsciiDoc document from Java and other JVM languages.
...
--------------------------------------------------------------------------------
Java (17.0.8.1-tem) https://projects.eclipse.org/projects/adoptium.temurin/
Java Platform, Standard Edition (or Java SE) is a widely used platform for
development and deployment of portable code for desktop and server environments.
Java SE uses the object-oriented Java programming language. It is part of the
Java software-platform family. Java SE defines a wide range of general-purpose
APIs – such as Java APIs for the Java Class Library – and also includes the Java
Language Specification and the Java Virtual Machine Specification.
$ sdk install java
...
sdk list <tab> 자동 완성을 이용하여 간단하게 설치 가능한 패키지 목록을 확인할 수 있다.

아래 명령은 특정 패키지의 설치가능한 목록을 보여준다.
$>sdk list <패키지명>
# 설치 가능한 java 패키지 목록 조회
$>sdk list java
설치 가능한 java 패키지 목록 결과는 아래와 같다.
================================================================================
Available Java Versions for macOS ARM 64bit
================================================================================
Vendor | Use | Version | Dist | Status | Identifier
--------------------------------------------------------------------------------
Corretto | | 20.0.2 | amzn | | 20.0.2-amzn
| | 20.0.1 | amzn | | 20.0.1-amzn
| | 17.0.8 | amzn | | 17.0.8-amzn
| | 17.0.7 | amzn | | 17.0.7-amzn
| | 11.0.20 | amzn | | 11.0.20-amzn
| | 11.0.19 | amzn | | 11.0.19-amzn
| | 8.0.382 | amzn | | 8.0.382-amzn
| | 8.0.372 | amzn | | 8.0.372-amzn
Gluon | | 22.1.0.1.r17 | gln | | 22.1.0.1.r17-gln
| | 22.1.0.1.r11 | gln | | 22.1.0.1.r11-gln
GraalVM CE | | 20.0.2 | graalce | | 20.0.2-graalce
| | 20.0.1 | graalce | | 20.0.1-graalce
| | 17.0.8 | graalce | | 17.0.8-graalce
| | 17.0.7 | graalce | | 17.0.7-graalce
GraalVM Oracle| | 20.0.2 | graal | | 20.0.2-graal
| | 20.0.1 | graal | | 20.0.1-graal
| | 17.0.8 | graal | | 17.0.8-graal
| | 17.0.7 | graal | | 17.0.7-graal
Java.net | | 22.ea.13 | open | | 22.ea.13-open
| | 22.ea.12 | open | | 22.ea.12-open
...
...
...
Temurin | | 20.0.2 | tem | | 20.0.2-tem
| | 20.0.1 | tem | | 20.0.1-tem
| | 17.0.8 | tem | | 17.0.8-tem
| | 17.0.8.1 | tem | | 17.0.8.1-tem
| | 17.0.7 | tem | | 17.0.7-tem
| | 11.0.20 | tem | | 11.0.20-tem
| | 11.0.20.1 | tem | | 11.0.20.1-tem
| | 11.0.19 | tem | | 11.0.19-tem
...
패키지 설치
# latest stable한 패키지 설치
$>sdk install <패키지명>
# 버전을 지정하여 설치
$>sdk install <패키지명> <Version | Identifier>
ex1) asciidoctorj 2.5.10 설치
$>sdk install asciidoctorj 2.5.10
ex2) Temurin 20.0.2-tem java 설치
$>sdk install java 20.0.2-tem
간단하게 sdk install <패키지명> <tab>을 통해서 자동완성으로 설치 가능한 버전을 확인할 수 있다.
아래 이미지는 sdk install java <tab> 을 통해 자동 완성된 것을 보여주는 이미지다.

sdkman을 통해 설치된 패키지는 [sdkman 설치경로] 하위의 candidates/<패키지명>/<버전>에 설치된다.
예를 들어 sdk install java 20.0.2-tem 명령으로 temurin java 20.0.2를 설치한 경우 설치 디렉터리는 아래와 같다.
<sdkman 설치 경로>/candidates/java/20.0.2-tem
<sdkman 설치 경로>/candidates/java 디렉터리의 목록을 보면
drwxr-xr-x@ 11 staff 352 7 20 15:05 20.0.2-tem
lrwxr-xr-x@ 1 staff 10 9 2 21:32 current -> 20.0.2-tem
위와 같은데 current symbolic link를 통해서 현재 버전 변경을 관리하는 듯하다.
기존 설치된 패키지 sdkman 관리에 포함시키기
sdkman을 통해서 설치한 것이 아닌 다른 방식으로 이미 패키지를 설치한 경우라도 sdkman 패키지 관리에 포함시킬 수 있다.
$>sdk install java tem-17-local /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
위 명령은 이미 설치된 temurin 17 java 가 /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home 에 설치된 java 패키지를 sdkman에 포함시킨다. tem-17-local로 지정한 값은 sdk list java 결과에 포함되지 않은 이름이어야 한다.
<sdkman 설치 경로>/candidates/java 디렉터리 목록을 보면 아래와 같이 변경된 것을 확인할 수 있다.
drwxr-xr-x@ 11 staff 352 7 20 15:05 20.0.2-tem
lrwxr-xr-x@ 1 staff 10 9 2 21:32 current -> 20.0.2-tem
lrwxr-xr-x@ 1 staff 62 9 2 21:43 tem-17-local -> /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
버전 변경
sdkman을 통해서 설치된 버전이 여러 개인 경우 버전을 변경할 수 있다.
$>sdk use <패키지명> <버전>
ex) java 패키지 버전을 tem-17-local 로 변경
$>sdk use java tem-17-local
$>sdk default <패키지명> <버전>
ex) java 패키지 버전을 tem-17-local 로 변경. current 의 링크가 tem-17-local 로 변경됨.
$>sdk default java tem-17-local
$>ls -l ~/.sdkman/candidates/java
drwxr-xr-x@ 11 staff 352 7 20 15:05 20.0.2-tem
lrwxr-xr-x@ 1 staff 56 9 2 22:05 current -> ~/.sdkman/candidates/java/tem-17-local
lrwxr-xr-x@ 1 staff 62 9 2 21:43 tem-17-local -> /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
버전을 변경하는 명령은 use와 default 가 있는데 차이점은 use의 경우에는 현재 쉘에만 적용되고, default의 경우에는 영구적으로 변경한다는 것이다.
버전 삭제
$>sdk uninstall <패키지명> <설치버전>
ex) temurin 20.0.2 java 버전 제거. tem-20.0.2 디렉토리가 삭제됨을 확인할 수 있다.
$>sdk uninatall java 20.0.2-tem
$>ls -l ~/.sdkman/candidates/java
lrwxr-xr-x@ 1 staff 56 9 2 22:05 current -> ~/.sdkman/candidates/java/tem-17-local
lrwxr-xr-x@ 1 staff 62 9 2 21:43 tem-17-local -> /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
위 명령은 설치된 패키지 버전을 제거한다. 만약 제거하고자 하는 버전이 current 버전이라면 삭제는 되지 않는다. --force 옵션을 추가하거나 설치된 다른 버전이 있다면 current 버전을 다른 버전으로 변경 후 삭제를 진행한다.
현재 패키지 버전 확인
현재 설치되어 적용된 패키지 버전을 확인할 수 있다.
$>sdk current
Using:
java: tem-17-local
$>sdk current java
Using java version tem-17-local
Configuration
sdkman의 설정 파일은 <sdkman 설치 경로>/etc/config 이다. sdk config 명령을 통해 설정 파일을 바로 편집할 수 있다.
$>sdk config
설정 파일 항목은 아래와 같다.
# make sdkman non-interactive, preferred for CI environments
sdkman_auto_answer=true|false
# check for newer versions and prompt for update
sdkman_selfupdate_feature=true|false
# disables SSL certificate verification
# https://github.com/sdkman/sdkman-cli/issues/327
# HERE BE DRAGONS....
sdkman_insecure_ssl=true|false
# configure curl timeouts
sdkman_curl_connect_timeout=5
sdkman_curl_continue=true
sdkman_curl_max_time=10
# subscribe to the beta channel
sdkman_beta_channel=true|false
# enable verbose debugging
sdkman_debug_mode=true|false
# enable colour mode
sdkman_colour_enable=true|false
# enable automatic env
sdkman_auto_env=true|false
# enable rosetta2 compatibility for apple silicon
sdkman_rosetta2_compatible=true|false
# enable bash or zsh auto-completion
# 이 설정이 true 로 되어 있어야 sdkman 자동완성이 지원된다.
sdkman_auto_complete=true|false
지금까지 sdkman 의 설치 방법과 사용법에 대해서 간략히 알아보았다. sdkman을 잘 활용하면 개발 도구 패키지를 찾아보고 직접 설치하는 시간을 절약하는데 많은 도움이 될 것 같다.
sdkman을 활용한 빌드 환경 설정
IntelliJ와 같은 IDE 환경에서 프로젝트 빌드를 수행할 수 있지만 때로는 CLI 환경에서 빌드를 하는 경우도 있다. 프로젝트를 함께 개발하고 있는 여러 팀원들이 각자 개발환경을 맞출 수도 있겠지만 sdkman을 활용하여 CLI 환경에서 동일한 빌드 환경을 손쉽게 맞출 수 있다.
.sdkmanrc 생성
프로젝트 루트에서 다음 명령을 실행하면 해당 경로에 .sdkmanrc 파일이 생성된다.
sdk env init
위 명령으로 초기에 생성된 .sdkmanrc 파일에는 java 버전 항목만 설정된 채로 생성된다.
java를 키로 한 설정항목에 지정되는 값은 현재 sdkman에 지정된 현재 버전이 설정된다.
sdkman에서 관리하고 있는 패키지에 대한 현재 사용 중인 버전을 확인하려면 아래 명령을 통해 확인한다.
~/workspace/java-project/ sdk current
Using:
gradle: 8.6
java: 17.0.14-tem
위 의미는 sdkman을 통해서 설치된 패키지 모듈은 gradle과 java인데 현재 시스템에 설정된 버전은 각각 8.6, 17.0.14-tem이라는 의미다.
실제로 ~/.sdkman/candidates/java 디렉터리를 보면 다음과 같이 되어 있다.
~/.sdkman/candidates/java/ ll ~/.sdkman/candidates/java
total 0
drwxr-xr-x@ 6 xxxxxxxxx staff 192 7 11 10:28 .
drwxr-xr-x 5 xxxxxxxxx staff 160 4 2 2024 ..
drwxr-xr-x@ 11 xxxxxxxxx staff 352 1 19 2024 11.0.22-tem
drwxr-xr-x@ 11 xxxxxxxxx staff 352 1 22 2025 17.0.14-tem
drwxr-xr-x@ 11 xxxxxxxxx staff 352 1 17 2024 21.0.2-tem
lrwxr-xr-x@ 1 xxxxxxxxx staff 52 7 11 10:28 current -> /Users/nohacking/.sdkman/candidates/java/17.0.14-tem
그럼 초기에 생성되는 파일에는 다음과 같은 값이 설정되어 있을 것이다.
# Enable auto-env through the sdkman_auto_env config
# Add key=value pairs of SDKs to use below
java=17.0.14-tem
생성된 .sdkmanrc 파일에 빌드에 필요한 각 패키지 모듈에 대한 버전을 설정하면 된다. 예를 들어 java 21 temurin, gradle 8.6 버전으로 빌드하고자 한다면 .sdkmanrc 파일은 다음과 같이 수정한다.
# Enable auto-env through the sdkman_auto_env config
# Add key=value pairs of SDKs to use below
java=21.0.2-tem
gradle=8.6
.sdkmanrc 파일에서 설정 키는 'sdk current' 명령으로 출력되는 candidate를 사용할 수 있다. (sdkman은 각 SDK 종류를 "candidate"라고 부른다.)
즉 위 예에서 .sdkmanrc에 설정할 수 있는 키는 java와 gradle이다. 만약 다른 SDK를 지정하기 위해서는 sdk 명령으로 수동으로 해당 SDK를 추가한 후 .sdkmanrc 파일에 설정을 추가해야 한다.
프로젝트에 .sdkmanrc 적용
사용하고자 하는 SDK에 대한 버전을 설정했다면 다음 명령을 통해서 적용할 수 있다.
sdk env
위 명령은 현재 디렉토리에 .sdkmanrc 파일이 있으면 그 안의 키-값을 읽어 그 쉘 세션에서만 해당 버전으로 전환을 한다.
기본값 (sdk default ...)을 바꾸지 않으며, SDKMAN의 current 심볼릭 링크도 건드리지 않는다.
# 프로젝트 루트( .sdkmanrc 존재 )에서
sdk env
# → .sdkmanrc에 설저된 SDK 버전을 이 세션에서만 활성화
만약 .sdkmanrc에 설정된 항목 중에 미설치 candidate가 있다면 설치 필요를 알려준다.
Stop! maven 3.9.9 is not installed.
이 경우 다음 명령을 통해서 자동 설치 및 전환을 할 수 있다.
sdk env install
미설치된 candidate가 있다면 다음과 같이 출력한다.
java 21.0.2-tem is already installed.
gradle 8.6 is already installed.
Downloading: maven 3.9.9
In progress...
######################################################################## 100.0%
Installing: maven 3.9.9
Done installing!
Using java version 21.0.2-tem in this shell.
Using gradle version 8.6 in this shell.
Setting maven version 3.9.9 as default.
Using maven version 3.9.9 in this shell.
maven 3.9.9 버전을 설치하고 설정된 각 candidate 버전으로 변경됨을 알 수 있다.
~/.sdkman/candidates 디렉터리를 보면 다음과 같이 maven candidate가 추가되어 있다.
ll ~/.sdkman/candidates
drwxr-xr-x 4 xxxxxxxxx staff 128 3 8 2024 gradle
drwxr-xr-x@ 6 xxxxxxxxx staff 192 7 11 10:28 java
drwxr-xr-x@ 4 xxxxxxxxx staff 128 10 22 14:15 maven
디렉토리 진입 시 자동 적용
sdkman 설정 파일 ~/.sdkman/etc/config 파일에서 sdkman_auto_env=true (디폴트 false)로 설정하면 해당 디렉터리로 진입/이탈 시 자동으로 .sdkmanrc가 적용/복원된다.
다음 명령을 통해서 바로 config 파일을 vi 모드로 열 수 있다.
sdk config
.sdkmanrc 파일 설정 후 git에 함께 커밋하여 같은 프로젝트를 하는 팀원들 간에 빌드 환경을 손쉽게 공유할 수 있다. 물론 각 팀원의 시스템 환경에 sdkman이 설치되어 있어야 한다.
관련링크
'ETC' 카테고리의 다른 글
| 맥 환경에서 iTerm2 개발 환경 셋팅하기 (0) | 2023.12.01 |
|---|---|
| java library를 이용한 DKIM 서명 및 검증 기능 구현하기 (0) | 2023.11.12 |
| Email DKIM(DomainKeys Identified Mail) 메시지 서명 및 검증 프로세스 (0) | 2023.11.08 |
| Email SPF (Sender Policy Framework) (0) | 2023.10.28 |
| 테스트 환경을 위한 mariadb, kafka docker compose (0) | 2023.09.18 |
댓글