@@ -16,14 +16,17 @@ source "$__source_guard_E2AA8C4F_215B_4CDA_9816_429C7A2CD465/common_utils.sh"
1616# ###############################################################################
1717# api functions:
1818#
19+ # - prepare_jdks::switch_to_jdk
20+ #
1921# - prepare_jdks::prepare_jdks
20- # - prepare_jdks::switch_java_home_to_jdk
2122#
2223# - prepare_jdks::install_jdk_by_sdkman
2324# - prepare_jdks::load_sdkman
2425# - prepare_jdks::install_sdkman
2526# ###############################################################################
2627
28+ # install sdkman.
29+ #
2730# shellcheck disable=SC2120
2831prepare_jdks::install_sdkman () {
2932 (( $# == 0 )) || cu::die " ${FUNCNAME[0]} requires no arguments! But provided $# : $* "
@@ -47,7 +50,9 @@ prepare_jdks::install_sdkman() {
4750}
4851
4952# load sdkman.
53+ #
5054# install sdkman if not installed yet.
55+ #
5156# shellcheck disable=SC2120
5257prepare_jdks::load_sdkman () {
5358 (( $# == 0 )) || cu::die " ${FUNCNAME[0]} requires no arguments! But provided $# : $* "
@@ -61,12 +66,13 @@ prepare_jdks::load_sdkman() {
6166 fi
6267}
6368
64- prepare_jdks::_sdkman_ls_java_content () {
65- [ -n " ${_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT:- } " ] && echo " $_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT "
69+ prepare_jdks::_get_sdkman_ls_java_content () {
70+ [ -n " ${_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT:- } " ] && {
71+ echo " $_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT "
72+ return
73+ }
6674
67- _PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT=$(
68- cu::loose_run sdk ls java | sed -n ' /^ Vendor/,/^===========/p'
69- )
75+ _PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT=" $( cu::loose_run sdk ls java | sed -n ' /^ Vendor/,/^===========/p' ) "
7076 echo " $_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT "
7177}
7278
@@ -77,49 +83,82 @@ prepare_jdks::ls_java() {
7783 prepare_jdks::load_sdkman
7884
7985 cu::blue_echo " sdk ls java:"
80- prepare_jdks::_sdkman_ls_java_content
86+ prepare_jdks::_get_sdkman_ls_java_content
8187}
8288
83- prepare_jdks::_set_available_jdk_versions_of_sdkman () {
84- prepare_jdks::load_sdkman
89+ # shellcheck disable=SC2120
90+ prepare_jdks::get_available_java_versions_of_sdkman () {
91+ (( $# == 0 )) || cu::die " ${FUNCNAME[0]} requires no arguments! But provided $# : $* "
8592
86- # Prefer mapfile or read -a to split command output (or quote to avoid splitting).
87- # https://github.com/koalaman/shellcheck/wiki/SC2207
88- #
89- # outputs multiple lines, each of which should be an element
90- PREPARE_JDKS_AVAILABLE_JDK_VERSIONS_OF_SDKMAN=()
91- local line
92- while IFS=' ' read -r line; do
93- PREPARE_JDKS_AVAILABLE_JDK_VERSIONS_OF_SDKMAN+=(" $line " )
94- done < <(
95- prepare_jdks::_sdkman_ls_java_content |
96- awk -F' [ \\t]*\\|[ \\t]*' ' /\|/ {print $NF}' |
97- sort -V
98- )
93+ [ -n " ${_PREPARE_JDKS_AVAILABLE_JAVA_VERSIONS_OF_SDKMAN:- } " ] && {
94+ echo " $_PREPARE_JDKS_AVAILABLE_JAVA_VERSIONS_OF_SDKMAN "
95+ return
96+ }
9997
100- PREPARE_JDKS_AVAILABLE_REMOTE_JDK_VERSIONS_OF_SDKMAN=()
101- while IFS=' ' read -r line; do
102- PREPARE_JDKS_AVAILABLE_REMOTE_JDK_VERSIONS_OF_SDKMAN+=(" $line " )
103- done < <(
104- prepare_jdks::_sdkman_ls_java_content |
105- awk -F' [ \\t]*\\|[ \\t]*' ' /\|/ && $5 !~ /^local/ {print $NF}' |
106- sort -V
107- )
98+ prepare_jdks::load_sdkman >&2
99+
100+ _PREPARE_JDKS_AVAILABLE_JAVA_VERSIONS_OF_SDKMAN=" $(
101+ prepare_jdks::_get_sdkman_ls_java_content |
102+ awk -F' [ \\t]*\\|[ \\t]*' ' NR > 2 && /\|/ {print $NF}' |
103+ sort -Vr
104+ ) "
105+
106+ echo " $_PREPARE_JDKS_AVAILABLE_JAVA_VERSIONS_OF_SDKMAN "
107+ }
108+
109+ # shellcheck disable=SC2120
110+ prepare_jdks::get_available_local_java_versions_of_sdkman () {
111+ (( $# == 0 )) || cu::die " ${FUNCNAME[0]} requires no arguments! But provided $# : $* "
112+
113+ [ -n " ${_PREPARE_JDKS_AVAILABLE_LOCAL_JAVA_VERSIONS_OF_SDKMAN:- } " ] && {
114+ echo " $_PREPARE_JDKS_AVAILABLE_LOCAL_JAVA_VERSIONS_OF_SDKMAN "
115+ return
116+ }
117+
118+ prepare_jdks::load_sdkman >&2
119+
120+ _PREPARE_JDKS_AVAILABLE_LOCAL_JAVA_VERSIONS_OF_SDKMAN=" $(
121+ printf ' %s\n' " $SDKMAN_CANDIDATES_DIR /java" /* / |
122+ awk -F/ ' $(NF-1) !~ /^current$/ {print $(NF-1)}' |
123+ sort -Vr
124+ ) "
125+
126+ echo " $_PREPARE_JDKS_AVAILABLE_LOCAL_JAVA_VERSIONS_OF_SDKMAN "
127+ }
128+
129+ # shellcheck disable=SC2120
130+ prepare_jdks::get_available_remote_java_versions_of_sdkman () {
131+ (( $# == 0 )) || cu::die " ${FUNCNAME[0]} requires no arguments! But provided $# : $* "
132+
133+ [ -n " ${_PREPARE_JDKS_AVAILABLE_REMOTE_JAVA_VERSIONS_OF_SDKMAN:- } " ] && {
134+ echo " $_PREPARE_JDKS_AVAILABLE_REMOTE_JAVA_VERSIONS_OF_SDKMAN "
135+ return
136+ }
137+
138+ prepare_jdks::load_sdkman >&2
139+
140+ _PREPARE_JDKS_AVAILABLE_REMOTE_JAVA_VERSIONS_OF_SDKMAN=" $(
141+ prepare_jdks::_get_sdkman_ls_java_content |
142+ awk -F' [ \\t]*\\|[ \\t]*' ' NR > 2 && /\|/ && $5 !~ /^local / {print $NF}' |
143+ sort -Vr
144+ ) "
145+
146+ echo " $_PREPARE_JDKS_AVAILABLE_REMOTE_JAVA_VERSIONS_OF_SDKMAN "
108147}
109148
110149prepare_jdks::_get_jdk_path_from_jdk_name_of_sdkman () {
111150 local jdk_name_of_sdkman=" $1 "
112- echo " $SDKMAN_CANDIDATES_DIR /java/$jdk_name_of_sdkman "
151+ local jdk_home_path=" $SDKMAN_CANDIDATES_DIR /java/$jdk_name_of_sdkman "
152+ echo " $jdk_home_path "
113153}
114154
115- # install the jdk by sdkman if not installed yet .
155+ # install the jdk by sdkman.
116156prepare_jdks::install_jdk_by_sdkman () {
117157 (( $# == 1 )) || cu::die " ${FUNCNAME[0]} requires exact 1 argument! But provided $# : $* "
118158
119159 prepare_jdks::load_sdkman
120160
121- local jdk_name_of_sdkman=" $1 "
122- local jdk_home_path
161+ local jdk_name_of_sdkman=" $1 " jdk_home_path
123162 jdk_home_path=" $(
124163 prepare_jdks::_get_jdk_path_from_jdk_name_of_sdkman " $jdk_name_of_sdkman "
125164 ) "
@@ -131,98 +170,110 @@ prepare_jdks::install_jdk_by_sdkman() {
131170 fi
132171}
133172
134- prepare_jdks::_prepare_one_jdk () {
135- local jdk_name_of_sdkman=" $1 "
136- local jdk_major_version=" ${jdk_name_of_sdkman// .*/ } "
137-
138- # java_home_var_name like JDK7_HOME, JDK11_HOME
139- local java_home_var_name=" JDK${jdk_major_version} _HOME"
140-
141- if [ -z " ${! java_home_var_name:- } " ]; then
142- # 1. prepare jdk home global var
143- #
144- # Dynamic variable names in Bash
145- # https://stackoverflow.com/a/55331060/922688
146- #
147- # read value of dynamic variable by:
148- # "${!var_which_value_is_var_name}"
149- # assign value to of dynamic variable by:
150- # printf -v "$var_which_value_is_var_name" %s value
151- local jdk_home_path
152- jdk_home_path=" $( prepare_jdks::_get_jdk_path_from_jdk_name_of_sdkman " $jdk_name_of_sdkman " ) "
153-
154- printf -v " $java_home_var_name " %s " ${jdk_home_path} "
155-
156- # 2. install jdk by sdkman
157- prepare_jdks::install_jdk_by_sdkman " $jdk_name_of_sdkman "
158- else
159- cu::yellow_echo " $java_home_var_name is already prepared: ${! java_home_var_name} "
160- cu::yellow_echo " so skip install $jdk_name_of_sdkman by sdkman"
173+ # shellcheck disable=SC2120
174+ prepare_jdks::_get_latest_java_version () {
175+ (( $# == 1 )) || cu::die " ${FUNCNAME[0]} requires exact 1 argument! But provided $# : $* "
176+
177+ local version_pattern=" $1 " input result
178+ input=$( cat)
179+
180+ # 1. first find non-ea and non-fx versions
181+ result=" $( echo " $input " | grep -vE ' \.ea\.|\.fx-' | cu::get_latest_version " $version_pattern " ) "
182+ if [ -n " $result " ]; then
183+ echo " $result "
184+ return 0
161185 fi
162186
163- JDK_HOME_VAR_NAMES+=(" $java_home_var_name " )
187+ # 2. then find versions
188+ echo " $input " | cu::get_latest_version " $version_pattern "
164189}
165190
166- # prepare jdks:
167- #
168- # usage:
169- # prepare_jdks::prepare_jdks <jdk_name_of_sdkman>...
170- #
171- # example:
172- # prepare_jdks::prepare_jdks 11.0.14-ms
173- # prepare_jdks::prepare_jdks 11.0.14-ms 17.0.2-zulu
174- #
175- # do the below works:
176- # 1. prepare jdk home global var, like
177- # JDK7_HOME=/path/to/jdk7/home
178- # JDK11_HOME=/path/to/jdk11/home
179- # 2. prepare jdk home global array var `JDK_HOME_VAR_NAMES`, like
180- # JDK_HOME_VAR_NAMES=($JDK7_HOME $JDK11_HOME)
181- # 3. install jdk by sdkman
182- prepare_jdks::prepare_jdks () {
183- (( $# > 0 )) || cu::die " ${FUNCNAME[0]} requires arguments! But no provided"
184-
185- JDK_HOME_VAR_NAMES=()
191+ prepare_jdks::_validate_java_home () {
192+ local -r switch_target=" $1 "
186193
187- local jdk_name_of_sdkman
188- for jdk_name_of_sdkman in " $@ " ; do
189- prepare_jdks::_prepare_one_jdk " $jdk_name_of_sdkman "
190- done
194+ [ -e " $JAVA_HOME " ] || cu::die " jdk $switch_target NOT existed: $JAVA_HOME "
195+ [ -d " $JAVA_HOME " ] || cu::die " jdk $switch_target is NOT directory: $JAVA_HOME "
191196
192- cu::blue_echo " prepared jdks:"
193- local java_home_var_name
194- for java_home_var_name in " ${JDK_HOME_VAR_NAMES[@]} " ; do
195- cu::blue_echo " $java_home_var_name : ${! java_home_var_name} "
196- done
197+ local java_cmd=" $JAVA_HOME /bin/java"
198+ [ -f " $java_cmd " ] || cu::die " \$ JAVA_HOME/bin/java ($java_cmd ) of $switch_target is NOT found!"
199+ [ -x " $java_cmd " ] || cu::die " \$ JAVA_HOME/bin/java ($java_cmd ) of $switch_target is NOT executable!"
197200}
198201
199202# usage:
200- # prepare_jdks::switch_java_home_to_jdk 11
201- # prepare_jdks::switch_java_home_to_jdk /path/to/java_home
202- prepare_jdks::switch_java_home_to_jdk () {
203+ # prepare_jdks::switch_to_jdk 11
204+ # prepare_jdks::switch_to_jdk /path/to/java_home
205+ prepare_jdks::switch_to_jdk () {
203206 [ $# == 1 ] || cu::die " ${FUNCNAME[0]} requires exact 1 argument! But provided $# : $* "
204207
205208 local -r switch_target=" $1 "
206209 [ -n " $switch_target " ] || cu::die " jdk $switch_target is blank"
207210
211+ # 1. first check env var JDK11_HOME
212+ #
213+ # set by java version, e.g.
214+ # prepare_jdks::switch_to_jdk 11
208215 if cu::is_number_string " $switch_target " ; then
209- # set by java version, e.g.
210- # prepare_jdks::switch_java_home_to_jdk 11
211216 local java_home_var_name=" JDK${switch_target} _HOME"
212- export JAVA_HOME=" ${! java_home_var_name:- } "
217+ if [ -d " ${! java_home_var_name:- } " ]; then
218+ export JAVA_HOME=" ${! java_home_var_name:- } "
219+ cu::yellow_echo " ${FUNCNAME[0]} $* : use \$ $java_home_var_name ($JAVA_HOME )"
220+
221+ prepare_jdks::_validate_java_home " $switch_target "
222+ return
223+ fi
224+ fi
213225
214- [ -n " $JAVA_HOME " ] || cu::die " JAVA_HOME of java version $switch_target ( $java_home_var_name ) is unset or blank: $JAVA_HOME "
215- else
226+ # 2. set by path of java installation
227+ if [ -d " $switch_target " ] ; then
216228 # set by java home path
217229 export JAVA_HOME=" $switch_target "
230+ cu::yellow_echo " ${FUNCNAME[0]} $* : use switch target $JAVA_HOME as java home directory"
231+
232+ prepare_jdks::_validate_java_home " $switch_target "
233+ return
218234 fi
219235
220- [ -e " $JAVA_HOME " ] || cu::die " jdk $switch_target NOT existed: $JAVA_HOME "
221- [ -d " $JAVA_HOME " ] || cu::die " jdk $switch_target is NOT directory: $JAVA_HOME "
236+ # 3. set by java version pattern of sdkman
237+ local -r version_pattern=" $switch_target "
238+ local version
239+ # 3.1 check *local* java versions of sdkman
240+ version=$(
241+ prepare_jdks::get_available_local_java_versions_of_sdkman |
242+ prepare_jdks::_get_latest_java_version " $version_pattern "
243+ )
244+ # 3.2 check *remote* java versions of sdkman
245+ if [ -z " ${version} " ]; then
246+ version=$(
247+ prepare_jdks::get_available_remote_java_versions_of_sdkman |
248+ prepare_jdks::_get_latest_java_version " $version_pattern "
249+ )
250+ fi
222251
223- local java_cmd=" $JAVA_HOME /bin/java"
224- [ -f " $java_cmd " ] || cu::die " \$ JAVA_HOME/bin/java ($java_cmd ) is NOT found!"
225- [ -x " $java_cmd " ] || cu::die " \$ JAVA_HOME/bin/java ($java_cmd ) is NOT executable!"
252+ [ -n " $version " ] || cu::die " fail to switch $switch_target "
253+
254+ prepare_jdks::install_jdk_by_sdkman " $version "
255+ JAVA_HOME=" $( prepare_jdks::_get_jdk_path_from_jdk_name_of_sdkman " $version " ) "
256+ export JAVA_HOME
257+ prepare_jdks::_validate_java_home " $switch_target "
258+ }
259+
260+ # prepare jdks:
261+ #
262+ # usage:
263+ # prepare_jdks::prepare_jdks <switch_target>...
264+ #
265+ # example:
266+ # prepare_jdks::prepare_jdks 8 11 17
267+ # prepare_jdks::prepare_jdks 11.0.14-ms 17.0.2-zulu
268+ prepare_jdks::prepare_jdks () {
269+ (( $# > 0 )) || cu::die " ${FUNCNAME[0]} requires arguments! But no provided"
270+
271+ cu::blue_echo " prepare jdks(${* } ) by switch_to_jdk"
272+ local switch_target
273+ for switch_target; do
274+ prepare_jdks::switch_to_jdk " $switch_target "
275+ done
276+ echo
226277}
227278
228279# ###############################################################################
0 commit comments