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.
- Ustaw za pomocą sdkman wersję javy odpowiednią dla danego projektu. W tym przykładzie
sdk use java 17.0.1-oracle
- 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
- Dodaj ten plik do repozytorium
- 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.
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ą.