软件安装-在Ubuntu安装sdkman最新版本

说明

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

其他不做赘述,详见参考资料或掘金内其他博客。

相关推荐
whhhhhhhhhw12 分钟前
Go语言-fmt包中Print、Println与Printf的区别
开发语言·后端·golang
ん贤41 分钟前
Zap日志库指南
后端·go
Spliceㅤ42 分钟前
Spring框架
java·服务器·后端·spring·servlet·java-ee·tomcat
IguoChan1 小时前
10. Redis Operator (3) —— 监控配置
后端
门前云梦3 小时前
ollama+open-webui本地部署自己的模型到d盘+两种open-webui部署方式(详细步骤+大量贴图)
前端·经验分享·笔记·语言模型·node.js·github·pip
Micro麦可乐3 小时前
前端与 Spring Boot 后端无感 Token 刷新 - 从原理到全栈实践
前端·spring boot·后端·jwt·refresh token·无感token刷新
方块海绵3 小时前
浅析 MongoDB
后端
中东大鹅3 小时前
SpringBoot配置外部Servlet
spring boot·后端·servlet
一语长情3 小时前
从《架构整洁之道》看编程范式:结构化、面向对象与函数式编程精要
后端·架构·代码规范
rzl024 小时前
SpringBoot(黑马)
java·spring boot·后端