|
| 1 | +#!/bin/bash |
| 2 | +# |
| 3 | +# java util functions. |
| 4 | +# |
| 5 | +################################################################################ |
| 6 | +# api functions: |
| 7 | +# |
| 8 | +# - java operation functions: |
| 9 | +# - jvu::get_java_version |
| 10 | +# - jvu::java_cmd |
| 11 | +################################################################################ |
| 12 | +# |
| 13 | +#_ source guard begin _# |
| 14 | +[ -z "${__source_guard_ED79675F_4289_4394_A843_03D06DB48AFA:+has_value}" ] || return 0 |
| 15 | +__source_guard_ED79675F_4289_4394_A843_03D06DB48AFA="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" |
| 16 | +readonly __source_guard_ED79675F_4289_4394_A843_03D06DB48AFA |
| 17 | +#_ source guard end _# |
| 18 | + |
| 19 | +set -eEuo pipefail |
| 20 | + |
| 21 | +# shellcheck source=common_utils.sh |
| 22 | +source "$__source_guard_ED79675F_4289_4394_A843_03D06DB48AFA/common_utils.sh" |
| 23 | + |
| 24 | +################################################################################# |
| 25 | +# java info functions |
| 26 | +################################################################################# |
| 27 | + |
| 28 | +# output the java version extracted from `java -version` |
| 29 | +jvu::get_java_version() { |
| 30 | + (($# <= 1)) || cu::die "${FUNCNAME[0]} requires at most 1 argument! But provided $#: $*" |
| 31 | + |
| 32 | + local java_home_path="${1:-$JAVA_HOME}" |
| 33 | + "$java_home_path/bin/java" -version 2>&1 | awk -F\" '/ version "/{print $2}' |
| 34 | +} |
| 35 | + |
| 36 | +################################################################################# |
| 37 | +# java operation functions |
| 38 | +################################################################################# |
| 39 | + |
| 40 | +jvu::_validate_java_home() { |
| 41 | + _jvu_VALIDATE_JAVA_HOME_ERR_MSG= |
| 42 | + |
| 43 | + local -r java_home="$1" |
| 44 | + if cu::is_blank_string "$java_home"; then |
| 45 | + _jvu_VALIDATE_JAVA_HOME_ERR_MSG="java home($java_home) is BLANK" |
| 46 | + return 1 |
| 47 | + fi |
| 48 | + |
| 49 | + if [ ! -e "$java_home" ]; then |
| 50 | + _jvu_VALIDATE_JAVA_HOME_ERR_MSG="java home($java_home) is NOT existed" |
| 51 | + return 1 |
| 52 | + fi |
| 53 | + if [ ! -d "$java_home" ]; then |
| 54 | + _jvu_VALIDATE_JAVA_HOME_ERR_MSG="java home($java_home) is NOT directory" |
| 55 | + return 1 |
| 56 | + fi |
| 57 | + |
| 58 | + local java_path="$java_home/bin/java" |
| 59 | + if [ ! -f "$java_path" ]; then |
| 60 | + _jvu_VALIDATE_JAVA_HOME_ERR_MSG="\$java_home/bin/java($java_path) is NOT existed" |
| 61 | + return 1 |
| 62 | + fi |
| 63 | + if [ ! -x "$java_path" ]; then |
| 64 | + _jvu_VALIDATE_JAVA_HOME_ERR_MSG="\$java_home/bin/java($java_path) is NOT executable" |
| 65 | + return 1 |
| 66 | + fi |
| 67 | +} |
| 68 | + |
| 69 | +# switch JAVA_HOME to target |
| 70 | +# |
| 71 | +# available switch target: |
| 72 | +# - version pattern, e.g. 11, 17 |
| 73 | +# determinate JAVA_HOME by env var JAVAx_HOME |
| 74 | +# - /path/to/java/home |
| 75 | +# |
| 76 | +# usage: |
| 77 | +# jvu::switch_to_jdk 17 |
| 78 | +# jvu::switch_to_jdk /path/to/java/home |
| 79 | +# |
| 80 | +jvu::switch_to_jdk() { |
| 81 | + [ $# == 1 ] || cu::die "${FUNCNAME[0]} requires exact 1 argument! But provided $#: $*" |
| 82 | + |
| 83 | + local -r switch_target="$1" |
| 84 | + cu::is_blank_string "$switch_target" && cu::die "switch target($switch_target) is BLANK!" |
| 85 | + |
| 86 | + # 1. first check env var JAVAx_HOME(e.g. JAVA11_HOME) |
| 87 | + # |
| 88 | + # aka. set by java version, e.g. |
| 89 | + # jvu::switch_to_jdk 11 |
| 90 | + if cu::is_number_string "$switch_target"; then |
| 91 | + local jdk_home_var_name="JAVA${switch_target}_HOME" |
| 92 | + # check env var JAVAx_HOME is defined or not |
| 93 | + if [ -z "${!jdk_home_var_name+defined}" ]; then |
| 94 | + cu::die "use \$$jdk_home_var_name as switch target, but \$$jdk_home_var_name is NOT defined!" >&2 |
| 95 | + fi |
| 96 | + local jdk_home="${!jdk_home_var_name:-}" |
| 97 | + if ! jvu::_validate_java_home "$jdk_home"; then |
| 98 | + cu::die "found \$$jdk_home_var_name($jdk_home) for switch target $switch_target, but $_jvu_VALIDATE_JAVA_HOME_ERR_MSG!" >&2 |
| 99 | + fi |
| 100 | + |
| 101 | + export JAVA_HOME="$jdk_home" |
| 102 | + return |
| 103 | + fi |
| 104 | + |
| 105 | + # 2. then switch as a directory |
| 106 | + # |
| 107 | + # aka. set by path of java installation, e.g. |
| 108 | + # jvu::switch_to_jdk /path/to/java/home |
| 109 | + local jdk_home="$switch_target" |
| 110 | + if ! jvu::_validate_java_home "$jdk_home"; then |
| 111 | + cu:die "use $switch_target directory as switch target, but $_jvu_VALIDATE_JAVA_HOME_ERR_MSG!" >&2 |
| 112 | + fi |
| 113 | + export JAVA_HOME="$jdk_home" |
| 114 | +} |
| 115 | + |
| 116 | +# FIXME hard code memery settings |
| 117 | +# shellcheck disable=SC2034 |
| 118 | +readonly JVU_DEFAULT_JAVA_OPTS=( |
| 119 | + -Xmx256m -Xms256m |
| 120 | + -server -ea |
| 121 | + -Duser.language=en -Duser.country=US |
| 122 | +) |
| 123 | + |
| 124 | +readonly JVU_JAVA_OPT_DEFAULT_DEBUG_PORT=5050 |
| 125 | + |
| 126 | +# set env variable ENABLE_JAVA_RUN_DEBUG to enable java debug mode |
| 127 | +jvu::java_cmd() { |
| 128 | + (($# > 0)) || cu::die "${FUNCNAME[0]} requires arguments! But no provided" |
| 129 | + |
| 130 | + local debug_opts="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=${JVU_JAVA_OPT_DEBUG_PORT}" |
| 131 | + |
| 132 | + cu::log_then_run "$JAVA_HOME/bin/java" \ |
| 133 | + "${JVU_JAVA_OPTS[@]}" \ |
| 134 | + ${JVU_ENABLE_JAVA_RUN_VERBOSE_CLASS+-verbose:class} \ |
| 135 | + ${JVU_ENABLE_JAVA_RUN_DEBUG+$debug_opts} \ |
| 136 | + "$@" |
| 137 | +} |
| 138 | + |
| 139 | +################################################################################ |
| 140 | +# auto run logic when source |
| 141 | +################################################################################ |
| 142 | + |
| 143 | +jvu::__auto_run_when_source() { |
| 144 | + # set VAR if absent |
| 145 | + |
| 146 | + if [ -z "${JVU_JAVA_OPT_DEBUG_PORT:-}" ]; then |
| 147 | + JVU_JAVA_OPT_DEBUG_PORT="$JVU_JAVA_OPT_DEFAULT_DEBUG_PORT" |
| 148 | + fi |
| 149 | + |
| 150 | + if [ -z "${JVU_JAVA_OPTS[*]:-}" ]; then |
| 151 | + JVU_JAVA_OPTS=("${JVU_DEFAULT_JAVA_OPTS[@]}") |
| 152 | + fi |
| 153 | +} |
| 154 | + |
| 155 | +jvu::__auto_run_when_source |
0 commit comments