카테고리 없음

SDKMAN - 개발 도구 손쉽게 관리하기

알쓸개잡 2023. 9. 2.

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> 을 통해 자동 완성된 것을 보여주는 이미지다.

SDK CLI 자동 완성

 

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 을 잘 활용하면 개발 도구 패키지를 찾아보고 직접 설치하는 시간을 절약하는데 많은 도움이 될 것 같다.

 


관련링크

https://sdkman.io/

 

댓글

💲 추천 글