SDKMAN - aplikacja do zarządzania wersjami narzędzi

SDKMAN1 to świetne narzędzie do instalacji wielu wersji różnych narzędzi i łatwego przełączania się pomiędzy wersjami. Śmiało można stwierdzić, że jest to niezbędnik każdego programisty.

Instalacja jest banalnie prosta.

1 curl -s "https://get.sdkman.io" | bash 
2 source "$HOME/.sdkman/bin/sdkman-init.sh"

Główne polecenia

W tym poście użyję przykładu zarządzania wersją javy.

sdk list

Wyświetla listę narzędzi możliwych do instalacji.
Na chwilę obecną lista wygląda tak:

 1activemq         doctoolchain     infrastructor    ki               mvnd             spark
 2ant              flink            java             kobweb           mybatis          springboot
 3asciidoctorj     gaiden           jbake            kotlin           neo4jmigrations  sshoogr
 4ballerina        gradle           jbang            kscript          pierrot          taxi
 5bpipe            gradleprofiler   jmc              layrry           pomchecker       test
 6btrace           grails           jmeter           leiningen        quarkus          tomcat
 7concurnas        groovy           joern            maven            sbt              vertx
 8connor           groovyserv       jreleaser        mcs              scala            visualvm
 9cuba             hadoop           karaf            micronaut        scalacli         webtau
10cxf              http4k           kcctl            mulefd           schemacrawler    znai

sdk list java

Wyświetla wersje narzędzia java dostępne do instalacji.
Poniżej fragment wyniku polecenia:

 1================================================================================
 2Available Java Versions for Linux 64bit
 3================================================================================
 4 Vendor        | Use | Version      | Dist    | Status     | Identifier
 5--------------------------------------------------------------------------------   
 6 Java.net      |     | 19.ea.18     | open    |            | 19.ea.18-open       
 7               |     | 19.ea.17     | open    |            | 19.ea.17-open       
 8               |     | 19.ea.16     | open    |            | 19.ea.16-open       
 9               |     | 19.ea.15     | open    |            | 19.ea.15-open       
10               |     | 19.ea.14     | open    |            | 19.ea.14-open       
11               |     | 19.ea.5.lm   | open    |            | 19.ea.5.lm-open     
12               |     | 19.ea.4.lm   | open    |            | 19.ea.4.lm-open     
13               |     | 19.ea.1.pma  | open    |            | 19.ea.1.pma-open    
14               |     | 18           | open    |            | 18-open             
15               |     | 17.0.2       | open    |            | 17.0.2-open         
16               |     | 16           | open    | local only | 16-open             
17               |     | 11.0.12      | open    | installed  | 17.0.1-oracle        
18               |     | 11.0.11      | open    |            | 11.0.11-open        
19               |     | 11.0.10      | open    |            | 11.0.10-open        
20               |     | 11.0.2       | open    |            | 11.0.2-open         
21               |     | 8.0.302      | open    |            | 8.0.302-open        
22               |     | 8.0.292      | open    | installed  | 8.0.292-open        
23               |     | 8.0.282      | open    |            | 8.0.282-open        
24               |     | 8.0.265      | open    |            | 8.0.265-open

sdk install java 17.0.1-oracle

Instalacja wersji z identyfikatorem 17.0.1-oracle.
Po instalacji otrzymamy pytanie czy chcemy tej wersji używać jako domyślna wersja w systemie.
Wynik polecenia:

 1Downloading: java 17.0.1-oracle
 2
 3In progress...
 4############################################ 100,0%
 5############################################ 100,0%
 6
 7Repackaging Java 17.0.1-oracle...
 8
 9Done repackaging...
10
11Installing: java 17.0.1-oracle
12Done installing!
13
14Do you want java 17.0.1-oracle to be set as default? (Y/n): 

sdk use java 17.0.1-oracle

Powyższym poleceniem można zmienić wersję, która ma być używana w bieżącej sesji terminala.
Wynik polecenia:

1Using java version 17.0.1-oracle in this shell.

Konfiguracja wersji javy per projekt

Przy pracy nad wieloma projektami może zdarzyć się, że jeden projekt potrzebuje java 8, inny java 11, a jeszcze inny java 7 😱

Na szczęście jest prosta recepta, aby nie musieć pamiętać/sprawdzać jakiej wersji używa dany projekt - polecenie sdk env zarządzające konfiguracją środowiska sdkman.

  1. Ustaw za pomocą sdkman wersję javy odpowiednią dla danego projektu. W tym przykładzie sdk use java 17.0.1-oracle
  2. W głównym katalogu projektu uruchom sdk env init. Zostanie utworzony plik .sdkmanrc zawierający:
  • nazwę narzędzia - w tym przypadku java java
  • wersję narzędzia - w tym przypadku 17.0.1-oracle Przykładowa zawartość poniżej:
    1java=17.0.1-oracle
    
  1. Dodaj ten plik do repozytorium
  2. Osoba, która będzie używała tego repozytorium na swoim komputerze, będzie mogła wykonać polecenie sdk env.
    Polecenie to ustawi w terminalu wersję javy ustawioną w pliku .sdkmanrc.
    Jeżeli dana wersja nie java jest zainstalowana to pokaże się komunikat
1Stop! Candidate version is not installed.
2
3Tip: Run the following to install this version
4
5$ sdk install java 17.0.1-oracle

Jeżeli dana wersja jest już zainstalowana to pokaże się komunikat

1Using java version 17.0.1-oracle in this shell.

Automatycznie ustawianie wersji javy po wejściu do katalogu projektu

Jest jeszcze wygodniejszy sposób na wykorzystanie konfiguracji środowiska sdkman.
Uruchamiamy polecenie sdk config, które otwiera edytor pliku konfiguracyjnego sdkman.
Ustawiamy preferencję sdkman_auto_env na true.
Następnie należy otworzyć nowe okno terminala lub uruchomić polecenie source "$HOME/.sdkman/bin/sdkman-init.sh".
Od teraz wchodząc do katalogu projektu, w którym jest plik .sdkmanrc wersja javy ustawi się automatycznie.
Dodatkowo po wyjściu z katalogu projektu wersja javy zostanie cofnięta do domyślnej wersji javy.

Konflikt z aplikacją hstr

W jednym z postów wspomniałem o przydanym narzędziu hstr.
W zależności od kolejności konfiguracji sdkman i hstr w pliku ~/.bashrc mogą przy każdym poleceniu pokazywać się komunikaty

1bash: PROMPT_COMMAND: line 0: syntax error near unexpected token `;'
2bash: PROMPT_COMMAND: line 0: `history -a; history -n; ;sdkman_auto_env'

W celu poprawy działania należy zamienić kolejnością konfiguracje w pliku ~/.bashrc. Poniżej przykład

 1#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
 2export SDKMAN_DIR="/home/user/.sdkman"
 3[[ -s "/home/user/.sdkman/bin/sdkman-init.sh" ]] && source "/home/user/.sdkman/bin/sdkman-init.sh"
 4
 5# HSTR configuration - add this to ~/.bashrc
 6alias hh=hstr                    # hh to be alias for hstr
 7export HSTR_CONFIG=hicolor       # get more colors
 8shopt -s histappend              # append new history items to .bash_history
 9export HISTCONTROL=ignorespace   # leading space hides commands from history
10export HISTFILESIZE=10000        # increase history file size (default is 500)
11export HISTSIZE=${HISTFILESIZE}  # increase history size (default is 500)
12# ensure synchronization between bash memory and history file
13export PROMPT_COMMAND="history -a; history -n; ${PROMPT_COMMAND}"
14# if this is interactive shell, then bind hstr to Ctrl-r (for Vi mode check doc)
15if [[ $- =~ .*i.* ]]; then bind '"\C-r": "\C-a hstr -- \C-j"'; fi
16# if this is interactive shell, then bind 'kill last command' to Ctrl-x k
17if [[ $- =~ .*i.* ]]; then bind '"\C-xk": "\C-a hstr -k \C-j"'; fi

Ten problem powinien zniknąć w kolejnych wersjach, ponieważ wystawiłem PR na github z poprawką.

Tłumaczenia: