Ustawianie wersji javy od dowolnego dostawcy za pomocą SDKMAN

Niestety sdkman nie umożliwia (jeszcze) ustawienia wersji javy bez wskazania dokładnego identyfikatora - czyli dokładnego numeru wersji oraz nazwy dostawcy np. 11.0.12-open.
Czasem może być potrzeba ustawienia po prostu java 11, która jest zainstalowana - dowolny numer patch, od dowolnego dostawcy.
Jest otwarte zgłoszenie na github #920 z propozycją wprowadzenia tej funkcjonalności.

Funkcja autocomplete po części ułatwia ustawienie wersji javy bez znajomości dokładnego identyfikatora. Po wpisaniu polecenia sdk use java 11 i kliknięciu 2 razy TAB wyświetla się lista zainstalowanych wersji java 11.

Problem pojawia się kiedy chcemy użyć ustawić wersję w jakimś skrypcie (np. w Continuous Integration).
Dlatego poniżej skrypt, który może być używany do realizacji takiego zadania.

Zapisz skrypt jako sdk_use_any_java.sh

1#!/bin/bash
2java_sdkman=$(find ~/.sdkman/candidates/java -mindepth 1 -maxdepth 1 -type d -printf "%f\n" | grep "^$1" | sort -r | head -n1)
3if [[ -z $java_sdkman ]]; then
4  echo "Can't find java $1 installed by sdkman"
5  exit
6fi
7source "$HOME/.sdkman/bin/sdkman-init.sh"
8sdk use java $java_sdkman

Użycie w celu ustawienia java w wersji 11

1./sdk_use_any_java.sh 11

Napisałem też skrypt dodający alias sdkj dzięki czemu można wywołać polecenie sdkj 11, aby ustawić java 11.

1alias sdkj='_sdkman_use_any_java(){ java_sdkman=$(find ~/.sdkman/candidates/java -mindepth 1 -maxdepth 1 -type d -printf "%f\n" | grep "^$1" | sort -r | head -n1) && if [[ -z $java_sdkman ]]; then echo "Cant find java $1 installed by sdkman"; return; fi && source "$HOME/.sdkman/bin/sdkman-init.sh" && sdk use java $java_sdkman; }; _sdkman_use_any_java'

Poniżej skrypt instalujący alias. Dostępny również na GIST:

1curl https://gist.githubusercontent.com/speedlog/c96ed2c40588c0482ea7123a5ae2f241/raw/c625bf9025634b4ee94336f8d1bd89276c9b68b0/sdk_use_any_java.sh >> ~/.bashrc
2source ~/.bashrc

Tłumaczenia: