mirror of
https://github.com/halcyon/asdf-java.git
synced 2024-10-06 07:42:09 +08:00
e883d242d0
Resolves the following error that displays for users who do not set ASDF_DIR: $HOME/.asdf/plugins/java/bin/list-all: line 3: /lib/utils.bash: No such file or directory As indicated in the [official asdf docs][asdf docs], `ASDF_DIR` should default to `~/.asdf`, though asdf itself defaults to `$HOME/.asdf`: > ASDF_DIR - Defaults to ~/.asdf - Location of the asdf scripts. If you install asdf to some other directory, set this to that directory. For example, if you are installing via the AUR, you should set this to /opt/asdf-vm. [asdf docs]: http://asdf-vm.com/manage/configuration.html#environment-variables
185 lines
6.1 KiB
Bash
Executable File
185 lines
6.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# shellcheck source=/dev/null
|
|
source "${ASDF_DIR:-$HOME/.asdf}/lib/utils.bash"
|
|
CACHE_DIR="${TMPDIR:-/tmp}/asdf-java.cache"
|
|
|
|
if [ ! -d "${CACHE_DIR}" ]
|
|
then
|
|
mkdir -p "${CACHE_DIR}"
|
|
fi
|
|
|
|
KERNEL_NAME="$(uname -s)"
|
|
case "${KERNEL_NAME}" in
|
|
Darwin)
|
|
OS="macosx"
|
|
SHA256SUM="shasum -a 256"
|
|
STAT="/usr/bin/stat"
|
|
STAT_OPTS=('-f' '%c')
|
|
TEMP_DIR=$(/usr/bin/mktemp -dt asdf-java)
|
|
;;
|
|
Linux)
|
|
OS="linux"
|
|
SHA256SUM="sha256sum"
|
|
STAT="stat"
|
|
STAT_OPTS=('-c' '%Z')
|
|
TEMP_DIR=$(mktemp -dp /tmp asdf-java.XXXXXXXX)
|
|
;;
|
|
*) echo "Unknown operating system: ${KERNEL_NAME}"
|
|
exit 1
|
|
esac
|
|
|
|
trap 'test -d "${TEMP_DIR}" && rm -rf "${TEMP_DIR}"' EXIT
|
|
|
|
MACHINE="$(uname -m)"
|
|
case "${MACHINE}" in
|
|
x86_64) ARCHITECTURE="x86_64" ;;
|
|
aarch64|arm64) ARCHITECTURE="aarch64" ;;
|
|
armv7l) ARCHITECTURE="arm32-vfp-hflt" ;;
|
|
*) echo "Unknown machine architecture: ${MACHINE}"
|
|
exit 1
|
|
esac
|
|
|
|
function check-unzip() {
|
|
USAGE="Install unzip to continue. Aborting."
|
|
|
|
if ! [ -x "$(command -v unzip)" ]; then
|
|
echo "${USAGE}" >&2
|
|
exit 1;
|
|
fi
|
|
}
|
|
|
|
function retrieve-release-data() {
|
|
local cache_file="${CACHE_DIR}/releases-${OS}-${ARCHITECTURE}.tsv"
|
|
# shellcheck disable=SC2046
|
|
if [[ ! -r "${cache_file}" ]] || (( $($STAT "${STAT_OPTS[@]}" "${cache_file}") <= $(date +%s) - 3600 )) ; then
|
|
curl -s -f --compressed -L "https://raw.githubusercontent.com/halcyon/asdf-java/master/data/jdk-${OS}-${ARCHITECTURE}.tsv" -o "${cache_file}"
|
|
fi
|
|
}
|
|
|
|
function list-all() {
|
|
retrieve-release-data
|
|
cut -d $'\t' -f 1 "${CACHE_DIR}/releases-${OS}-${ARCHITECTURE}.tsv" | uniq | tr '\n' ' '
|
|
}
|
|
|
|
function list-legacy-filenames() {
|
|
echo ".java-version"
|
|
}
|
|
|
|
function install {
|
|
local release_data package_link package_filename checksum
|
|
local -a dirs
|
|
|
|
retrieve-release-data
|
|
|
|
release_data=$(grep "^${ASDF_INSTALL_VERSION} " "${CACHE_DIR}/releases-${OS}-${ARCHITECTURE}.tsv" | tail -n 1)
|
|
if [[ -z "${release_data}" ]]; then
|
|
echo "Unknown release: ${ASDF_INSTALL_VERSION}"
|
|
exit 1
|
|
fi
|
|
|
|
package_filename=$(cut -d $'\t' -f 2 <<<"${release_data}")
|
|
package_link=$(cut -d $'\t' -f 3 <<<"${release_data}")
|
|
checksum=$(cut -d $'\t' -f 4 <<<"${release_data}")
|
|
|
|
if [[ "${package_filename}" =~ "zip$" ]]; then
|
|
check-unzip
|
|
fi
|
|
|
|
cd "${TEMP_DIR}" || return 1
|
|
if ! curl -LO -# -w "${package_filename}\n" "${package_link}"; then
|
|
exit 1
|
|
fi
|
|
|
|
${SHA256SUM} -c <<<"${checksum} ${package_filename}"
|
|
|
|
case "${package_filename}" in
|
|
*zip) unzip "${package_filename}"
|
|
;;
|
|
*tar.gz) tar xf "${package_filename}"
|
|
;;
|
|
*) echo "Cannot extract ${package_filename}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
read -r -a dirs <<<"$(ls -d ./*/)"
|
|
cd "${dirs[0]}" || return 1
|
|
if [ ! -d "${ASDF_INSTALL_PATH}" ]; then
|
|
mkdir -p "${ASDF_INSTALL_PATH}"
|
|
fi
|
|
|
|
case ${OS} in
|
|
macosx)
|
|
case ${ASDF_INSTALL_VERSION} in
|
|
zulu*)
|
|
mv ./* "${ASDF_INSTALL_PATH}"
|
|
if [ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]; then
|
|
local macOS_integration_path
|
|
macOS_integration_path="$(dirname "$(dirname "$(dirname "$(absolute_dir_path "${ASDF_INSTALL_PATH}/bin/..")")")")"
|
|
java_macos_integration_install "$macOS_integration_path"
|
|
fi
|
|
;;
|
|
liberica*)
|
|
mv ./* "${ASDF_INSTALL_PATH}"
|
|
if [ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]; then
|
|
echo "The ZIP packages of liberica do not contain the required files (Info.plist and the MacOS folder) to make /usr/libexec/java_home work correctly. You need the .pkg version to get those files."
|
|
fi
|
|
;;
|
|
*)
|
|
mv Contents/Home/* "${ASDF_INSTALL_PATH}"
|
|
if [ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]; then
|
|
local macOS_integration_path
|
|
macOS_integration_path="$(absolute_dir_path ".")"
|
|
java_macos_integration_install "$macOS_integration_path"
|
|
fi
|
|
;;
|
|
esac ;;
|
|
*) mv ./* "${ASDF_INSTALL_PATH}" ;;
|
|
esac
|
|
}
|
|
|
|
function uninstall {
|
|
case ${OS} in
|
|
macosx)
|
|
if [ -z "${ASDF_INSTALL_VERSION}" ]; then
|
|
true
|
|
else
|
|
if [ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]; then
|
|
java_macos_integration_remove
|
|
fi
|
|
fi
|
|
esac
|
|
rm -rf "${ASDF_INSTALL_PATH}"
|
|
}
|
|
|
|
function java_macos_integration_remove {
|
|
printf "Removing the integration with /usr/libexec/java_home needs root permission to delete the folder at /Library/Java/JavaVirtualMachines/%s\n" "${ASDF_INSTALL_VERSION}"
|
|
sudo rm -rf "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}"
|
|
}
|
|
|
|
function java_macos_integration_install {
|
|
local macOS_files_path
|
|
macOS_files_path="$1"
|
|
printf "Integrating with /usr/libexec/java_home needs root permission for it to create folders under /Library/Java/JavaVirtualMachines\n"
|
|
sudo mkdir -p "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents"
|
|
sudo cp -R "${macOS_files_path}/Contents/MacOS" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/"
|
|
sudo cp -R "${macOS_files_path}/Contents/Info.plist" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/"
|
|
sudo ln -s "${ASDF_INSTALL_PATH}" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/Home"
|
|
}
|
|
|
|
function absolute_dir_path {
|
|
local absolute_path
|
|
absolute_path="$( cd -P "$( dirname "$1" )" && pwd )"
|
|
echo "$absolute_path"
|
|
}
|
|
|
|
case "$(basename "${0}")" in
|
|
list-all) list-all
|
|
;;
|
|
list-legacy-filenames) list-legacy-filenames
|
|
;;
|
|
install) install
|
|
;;
|
|
uninstall) uninstall ;;
|
|
esac
|