说明
sdkman是一款JDK和SDK安装管理软件,可以快捷在主机部署指定版本JDK和SDK,并且快捷切换使用。 因主机环境需使用JDK8编译软件,用JDK17运行特定其他软件,采用该工具做JDK临时管理。
安装
参考资料,https://sdkman.io/install
官网安装方法,联网,网络不受限环境安装,访问海外网络正常。
受限地区安装方法,联网,网络受限环境安装,访问GitHub异常。
sdkman可离线使用,但需自己手动安装JDK或SDK后纳管到sdkman工具。
应优先在Linux环境使用。本文档以ubuntu22环境为例。
配置基础环境
bash
apt install unzip zip tar curl sed -y
官网安装
安装,验证
bash
cd /opt
export SDKMAN_DIR="/opt/sdkman" && curl -s "https://get.sdkman.io" | bash
source "/opt/sdkman/bin/sdkman-init.sh"
sdk help
受限地区安装
方法1,使用现有脚本一键部署,可能非sdkman最新版本。
方法2,可用sdkman最新版本,自定义安装脚本,配置繁琐易出错。
方法1
在Ubuntu执行以下命令,
bash
cat > sdkman_install.sh << EOF
#!/bin/bash
#
# Copyright 2017 Marco Vermeulen
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# install:- channel: stable; cliVersion: 5.19.0; cliNativeVersion: 0.7.4; api: https://api.sdkman.io/2
set -e
track_last_command() {
last_command=$current_command
current_command=$BASH_COMMAND
}
trap track_last_command DEBUG
echo_failed_command() {
local exit_code="$?"
if [[ "$exit_code" != "0" ]]; then
echo "'$last_command': command failed with exit code $exit_code."
fi
}
trap echo_failed_command EXIT
# Global variables
export SDKMAN_SERVICE="https://api.sdkman.io/2"
export SDKMAN_VERSION="5.19.0"
export SDKMAN_NATIVE_VERSION="0.7.4"
if [ -z "$SDKMAN_DIR" ]; then
SDKMAN_DIR="$HOME/.sdkman"
SDKMAN_DIR_RAW='$HOME/.sdkman'
else
SDKMAN_DIR_RAW="$SDKMAN_DIR"
fi
export SDKMAN_DIR
# Local variables
sdkman_src_folder="${SDKMAN_DIR}/src"
sdkman_libexec_folder="${SDKMAN_DIR}/libexec"
sdkman_tmp_folder="${SDKMAN_DIR}/tmp"
sdkman_ext_folder="${SDKMAN_DIR}/ext"
sdkman_etc_folder="${SDKMAN_DIR}/etc"
sdkman_var_folder="${SDKMAN_DIR}/var"
sdkman_candidates_folder="${SDKMAN_DIR}/candidates"
sdkman_config_file="${sdkman_etc_folder}/config"
sdkman_platform_file="${sdkman_var_folder}/platform"
sdkman_bash_profile="${HOME}/.bash_profile"
sdkman_profile="${HOME}/.profile"
sdkman_bashrc="${HOME}/.bashrc"
sdkman_zshrc="${ZDOTDIR:-${HOME}}/.zshrc"
sdkman_init_snippet=$( cat << EOF
#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="$SDKMAN_DIR_RAW"
[[ -s "${SDKMAN_DIR_RAW}/bin/sdkman-init.sh" ]] && source "${SDKMAN_DIR_RAW}/bin/sdkman-init.sh"
EOF
)
# OS specific support (must be 'true' or 'false').
cygwin=false;
darwin=false;
solaris=false;
freebsd=false;
case "$(uname)" in
CYGWIN*)
cygwin=true
;;
Darwin*)
darwin=true
;;
SunOS*)
solaris=true
;;
FreeBSD*)
freebsd=true
esac
echo ''
echo ' -+syyyyyyys:'
echo ' `/yho:` -yd.'
echo ' `/yh/` +m.'
echo ' .oho. hy .`'
echo ' .sh/` :N` `-/o` `+dyyo:.'
echo ' .yh:` `M- `-/osysoym :hs` `-+sys: hhyssssssssy+'
echo ' .sh:` `N: ms/-`` yy.yh- -hy. `.N-````````+N.'
echo ' `od/` `N- -/oM- ddd+` `sd: hNNm -N:'
echo ' :do` .M. dMMM- `ms. /d+` `NMMs `do'
echo ' .yy- :N` ```mMMM. - -hy. /MMM: yh'
echo ' `+d+` `:/oo/` `-/osyh/ossssssdNMM` .sh: yMMN` /m.'
echo ' -dh- :ymNMMMMy `-/shmNm-`:N/-.`` `.sN /N- `NMMy .m/'
echo ' `oNs` -hysosmMMMMydmNmds+-.:ohm : sd` :MMM/ yy'
echo ' .hN+ /d: -MMMmhs/-.` .MMMh .ss+- `yy` sMMN` :N.'
echo ' :mN/ `N/ `o/-` :MMMo +MMMN- .` `ds mMMh do'
echo ' /NN/ `N+....--:/+oooosooo+:sMMM: hMMMM: `my .m+ -MMM+ :N.'
echo ' /NMo -+ooooo+/:-....`...:+hNMN. `NMMMd` .MM/ -m: oMMN. hs'
echo ' -NMd` :mm -MMMm- .s/ -MMm. /m- mMMd -N.'
echo ' `mMM/ .- /MMh. -dMo -MMMy od. .MMMs..---yh'
echo ' +MMM. sNo`.sNMM+ :MMMM/ sh`+MMMNmNm+++-'
echo ' mMMM- /--ohmMMM+ :MMMMm. `hyymmmdddo'
echo ' MMMMh. ```` `-+yy/`yMMM/ :MMMMMy -sm:.``..-:-.`'
echo ' dMMMMmo-.``````..-:/osyhddddho. `+shdh+. hMMM: :MmMMMM/ ./yy/` `:sys+/+sh/'
echo ' .dMMMMMMmdddddmmNMMMNNNNNMMMMMs sNdo- dMMM- `-/yd/MMMMm-:sy+. :hs- /N`'
echo ' `/ymNNNNNNNmmdys+/::----/dMMm: +m- mMMM+ohmo/.` sMMMMdo- .om: `sh'
echo ' `.-----+/.` `.-+hh/` `od. NMMNmds/ `mmy:` +mMy `:yy.'
echo ' /moyso+//+ossso:. .yy` `dy+:` .. :MMMN+---/oys:'
echo ' /+m: `.-:::-` /d+ +MMMMMMMNh:`'
echo ' +MN/ -yh. `+hddhy+.'
echo ' /MM+ .sh:'
echo ' :NMo -sh/'
echo ' -NMs `/yy:'
echo ' .NMy `:sh+.'
echo ' `mMm` ./yds-'
echo ' `dMMMmyo:-.````.-:oymNy:`'
echo ' +NMMMMMMMMMMMMMMMMms:`'
echo ' -+shmNMMMNmdy+:`'
echo ''
echo ''
echo ' Now attempting installation...'
echo ''
echo ''
# Sanity checks
echo "Looking for a previous installation of SDKMAN..."
if [ -d "$SDKMAN_DIR" ]; then
echo "SDKMAN found."
echo ""
echo "======================================================================================================"
echo " You already have SDKMAN installed."
echo " SDKMAN was found at:"
echo ""
echo " ${SDKMAN_DIR}"
echo ""
echo " Please consider running the following if you need to upgrade."
echo ""
echo " $ sdk selfupdate force"
echo ""
echo "======================================================================================================"
echo ""
exit 0
fi
echo "Looking for unzip..."
if ! command -v unzip > /dev/null; then
echo "Not found."
echo "======================================================================================================"
echo " Please install unzip on your system using your favourite package manager."
echo ""
echo " Restart after installing unzip."
echo "======================================================================================================"
echo ""
exit 1
fi
echo "Looking for zip..."
if ! command -v zip > /dev/null; then
echo "Not found."
echo "======================================================================================================"
echo " Please install zip on your system using your favourite package manager."
echo ""
echo " Restart after installing zip."
echo "======================================================================================================"
echo ""
exit 1
fi
echo "Looking for tar..."
if ! command -v tar > /dev/null; then
echo "Not found."
echo "======================================================================================================"
echo " Please install tar on your system using your favourite package manager."
echo ""
echo " Restart after installing tar."
echo "======================================================================================================"
echo ""
exit 1
fi
echo "Looking for curl..."
if ! command -v curl > /dev/null; then
echo "Not found."
echo ""
echo "======================================================================================================"
echo " Please install curl on your system using your favourite package manager."
echo ""
echo " Restart after installing curl."
echo "======================================================================================================"
echo ""
exit 1
fi
if [[ "$solaris" == true ]]; then
echo "Looking for gsed..."
if [ -z $(which gsed) ]; then
echo "Not found."
echo ""
echo "======================================================================================================"
echo " Please install gsed on your solaris system."
echo ""
echo " SDKMAN uses gsed extensively."
echo ""
echo " Restart after installing gsed."
echo "======================================================================================================"
echo ""
exit 1
fi
else
echo "Looking for sed..."
if [ -z $(command -v sed) ]; then
echo "Not found."
echo ""
echo "======================================================================================================"
echo " Please install sed on your system using your favourite package manager."
echo ""
echo " Restart after installing sed."
echo "======================================================================================================"
echo ""
exit 1
fi
fi
echo "Installing SDKMAN scripts..."
# Create directory structure
echo "Create distribution directories..."
mkdir -p "$sdkman_tmp_folder"
mkdir -p "$sdkman_ext_folder"
mkdir -p "$sdkman_etc_folder"
mkdir -p "$sdkman_var_folder"
mkdir -p "$sdkman_candidates_folder"
echo "Getting available candidates..."
SDKMAN_CANDIDATES_CSV=$(curl -s "${SDKMAN_SERVICE}/candidates/all")
echo "$SDKMAN_CANDIDATES_CSV" > "${SDKMAN_DIR}/var/candidates"
echo "Prime platform file..."
# infer platform
function infer_platform() {
local kernel
local machine
kernel="$(uname -s)"
machine="$(uname -m)"
case $kernel in
Linux)
case $machine in
i686)
echo "linuxx32"
;;
x86_64)
echo "linuxx64"
;;
armv6l)
echo "linuxarm32hf"
;;
armv7l)
echo "linuxarm32hf"
;;
armv8l)
echo "linuxarm32hf"
;;
aarch64)
echo "linuxarm64"
;;
*)
echo "exotic"
;;
esac
;;
Darwin)
case $machine in
x86_64)
echo "darwinx64"
;;
arm64)
echo "darwinarm64"
;;
*)
echo "darwinx64"
;;
esac
;;
MSYS*|MINGW*)
case $machine in
x86_64)
echo "windowsx64"
;;
*)
echo "exotic"
;;
esac
;;
*)
echo "exotic"
esac
}
export SDKMAN_PLATFORM="$(infer_platform)"
echo "$SDKMAN_PLATFORM" > "$sdkman_platform_file"
echo "Prime the config file..."
touch "$sdkman_config_file"
# Interactive mode - optimized for human use
echo "sdkman_auto_answer=false" >> "$sdkman_config_file"
echo "sdkman_colour_enable=true" >> "$sdkman_config_file"
echo "sdkman_selfupdate_feature=true" >> "$sdkman_config_file"
# Set shell-specific config
if [ -z "$ZSH_VERSION" -a -z "$BASH_VERSION" ]; then
echo "sdkman_auto_complete=false" >> "$sdkman_config_file"
else
echo "sdkman_auto_complete=true" >> "$sdkman_config_file"
fi
# Common settings that don't change based on CI mode
echo "sdkman_auto_env=false" >> "$sdkman_config_file"
echo "sdkman_beta_channel=false" >> "$sdkman_config_file"
echo "sdkman_checksum_enable=true" >> "$sdkman_config_file"
echo "sdkman_curl_connect_timeout=7" >> "$sdkman_config_file"
echo "sdkman_curl_max_time=10" >> "$sdkman_config_file"
echo "sdkman_debug_mode=false" >> "$sdkman_config_file"
echo "sdkman_insecure_ssl=false" >> "$sdkman_config_file"
echo "sdkman_native_enable=true" >> "$sdkman_config_file"
# script cli distribution
echo "Installing script cli archive..."
# fetch distribution
sdkman_zip_file="${sdkman_tmp_folder}/sdkman-${SDKMAN_VERSION}.zip"
echo "* Downloading..."
curl --fail --location --progress-bar "https://ghp.ml1.one/https://github.com/sdkman/sdkman-cli/releases/download/5.19.0/sdkman-cli-5.19.0.zip" > "$sdkman_zip_file"
# check integrity
echo "* Checking archive integrity..."
ARCHIVE_OK=$(unzip -qt "$sdkman_zip_file" | grep 'No errors detected in compressed data')
if [[ -z "$ARCHIVE_OK" ]]; then
echo "Downloaded zip archive corrupt. Are you connected to the internet?"
echo ""
echo "If problems persist, please ask for help on our Discord server:"
echo "* easy sign up:"
echo " https://discord.gg/y9mVJYVyu4"
echo "* report on our #help channel:"
echo " https://discord.com/channels/1245471991117512754/1245486255295299644"
exit
fi
# extract archive
echo "* Extracting archive..."
if [[ "$cygwin" == 'true' ]]; then
sdkman_tmp_folder=$(cygpath -w "$sdkman_tmp_folder")
sdkman_zip_file=$(cygpath -w "$sdkman_zip_file")
fi
unzip -qo "$sdkman_zip_file" -d "$sdkman_tmp_folder"
# copy in place
echo "* Copying archive contents..."
rm -f "$sdkman_src_folder"/*
cp -rf "${sdkman_tmp_folder}"/sdkman-*/* "$SDKMAN_DIR"
# clean up
echo "* Cleaning up..."
rm -rf "$sdkman_tmp_folder"/sdkman-*
rm -rf "$sdkman_zip_file"
echo ""
# native cli distribution
if [[ "$SDKMAN_PLATFORM" != "exotic" ]]; then
echo "Installing script cli archive..."
# fetch distribution
sdkman_zip_file="${sdkman_tmp_folder}/sdkman-native-${SDKMAN_NATIVE_VERSION}.zip"
echo "* Downloading..."
curl --fail --location --progress-bar "https://ghp.ml1.one/https://github.com/sdkman/sdkman-cli-native/releases/download/v0.7.4/sdkman-cli-native-0.7.4-x86_64-unknown-linux-gnu.zip" > "$sdkman_zip_file"
# check integrity
echo "* Checking archive integrity..."
ARCHIVE_OK=$(unzip -qt "$sdkman_zip_file" | grep 'No errors detected in compressed data')
if [[ -z "$ARCHIVE_OK" ]]; then
echo "Downloaded zip archive corrupt. Are you connected to the internet?"
echo ""
echo "If problems persist, please ask for help on our Discord server:"
echo "* easy sign up:"
echo " https://discord.gg/y9mVJYVyu4"
echo "* report on our #help channel:"
echo " https://discord.com/channels/1245471991117512754/1245486255295299644"
exit
fi
# extract archive
echo "* Extracting archive..."
if [[ "$cygwin" == 'true' ]]; then
sdkman_tmp_folder=$(cygpath -w "$sdkman_tmp_folder")
sdkman_zip_file=$(cygpath -w "$sdkman_zip_file")
fi
unzip -qo "$sdkman_zip_file" -d "$sdkman_tmp_folder"
# copy in place
echo "* Copying archive contents..."
rm -f "$sdkman_libexec_folder"/*
cp -rf "${sdkman_tmp_folder}"/sdkman-*/* "$SDKMAN_DIR"
# clean up
echo "* Cleaning up..."
rm -rf "$sdkman_tmp_folder"/sdkman-*
rm -rf "$sdkman_zip_file"
echo ""
fi
echo "Set version to $SDKMAN_VERSION ..."
echo "$SDKMAN_VERSION" > "${SDKMAN_DIR}/var/version"
echo "Set native version to $SDKMAN_NATIVE_VERSION ..."
echo "$SDKMAN_NATIVE_VERSION" > "${SDKMAN_DIR}/var/version_native"
if [[ $darwin == true ]]; then
touch "$sdkman_bash_profile"
echo "Attempt update of login bash profile on OSX..."
if [[ -z $(grep 'sdkman-init.sh' "$sdkman_bash_profile") ]]; then
echo -e "\n$sdkman_init_snippet" >> "$sdkman_bash_profile"
echo "Added sdkman init snippet to $sdkman_bash_profile"
fi
else
echo "Attempt update of interactive bash profile on regular UNIX..."
touch "${sdkman_bashrc}"
if [[ -z $(grep 'sdkman-init.sh' "$sdkman_bashrc") ]]; then
echo -e "\n$sdkman_init_snippet" >> "$sdkman_bashrc"
echo "Added sdkman init snippet to $sdkman_bashrc"
fi
fi
echo "Attempt update of zsh profile..."
touch "$sdkman_zshrc"
if [[ -z $(grep 'sdkman-init.sh' "$sdkman_zshrc") ]]; then
echo -e "\n$sdkman_init_snippet" >> "$sdkman_zshrc"
echo "Updated existing ${sdkman_zshrc}"
fi
echo -e "\n\n\nAll done!\n\n"
echo "You are subscribed to the STABLE channel."
echo ""
echo "Please open a new terminal, or run the following in the existing one:"
echo ""
echo " source \"${SDKMAN_DIR}/bin/sdkman-init.sh\""
echo ""
echo "Then issue the following command:"
echo ""
echo " sdk help"
echo ""
echo "Enjoy!!!"
EOF
授权文件,安装,查询验证
bash
chmod +x sdkman_install.sh
./sdkman_install.sh
source "/opt/sdkman/bin/sdkman-init.sh"
sdk help
若脚本执行异常,需修改脚本,将脚本中https://ghp.ml1.one/
替换为其他可用的GitHub加速地址。
方法2
浏览器访问浏览器访问https://sdkman.io/install
,可见下图所示安装脚本https://get.sdkman.io
,复制到文件编辑工具。此处以windows的文本编辑器为例,
分析脚本,找到下载文件的部分, 懒得分析可以让AI分析,话术是"帮我分析以下Ubuntu的Linux shell脚本,找到脚本下载了哪些文件,将文件的地址展示给我"。也可自己分析,找到下载文件的部分。
环境变量在39行,
检查内核版本,此处需注意, machine后面要用。此处确认当前系统和机器架构。
此处关键,定义软件版本信息,下载软件,部分变量在全局变量已经赋值。
重点是352行的内容,
bash
${SDKMAN_SERVICE}/broker/download/sdkman/install/${SDKMAN_VERSION}/${SDKMAN_PLATFORM}" > "$sdkman_zip_file
经过手动拼接变量真实的值,可以得到
bash
https://api.sdkman.io/2/broker/download/sdkman/install/5.19.0/linuxx64" > "$sdkman_zip_file
将文件地址https://api.sdkman.io/2/broker/download/sdkman/install/5.19.0/linuxx64
复制到浏览器查看,发现网络受限,访问不到,此时地址跳转到真实地址https://github.com/sdkman/sdkman-cli/releases/download/5.19.0/sdkman-cli-5.19.0.zip
,后续若sdkman更新版本,可直接查看最新安装脚本,将版本信息替换。
找GitHub加速地址,修改为https://ghfast.top/https://github.com/sdkman/sdkman-cli/releases/download/5.19.0/sdkman-cli-5.19.0.zip
。
修改后的352行内容是,
bash
curl --fail --location --progress-bar "https://ghfast.top/https://github.com/sdkman/sdkman-cli/releases/download/5.19.0/sdkman-cli-5.19.0.zip" > "$sdkman_zip_file"
往下继续看到389行,对395行地址做拼接,替换环境变量为真实值,处理得
https://api.sdkman.io/2/broker/download/native/install/0.7.4/linuxx64

此处两种情况,偶发可以直接访问,若可以直接访问,行395不用修改。若不能直接访问,参考前面复制到浏览器,将最终跳转的GitHub地址加上加速地址,复制到行395做替换。
在文件首行添加cat > sdkman_install.sh << EOF
,尾行添加EOF
。 复制到Linux执行命令,可得文件sdkman_install.sh
授权,安装,验证,
bash
chmod +x sdkman_install.sh
./sdkman_install.sh
# 安装后会看到类似source "/opt/sdkman/bin/sdkman-init.sh"的提示,复制粘贴执行,完成环境变量配置。
source "/opt/sdkman/bin/sdkman-init.sh"
sdk help
使用
参考资料https://sdkman.io/usage
查询Java是否可安装
shell
root@master Thu Jul 24 [13:16:55] : ~# sdk list
/java
查询可安装的Java版本
shell
root@master Thu Jul 24 [13:16:55] : ~
# sdk list java
其他不做赘述,详见参考资料或掘金内其他博客。