36 lines
1.5 KiB
Bash
36 lines
1.5 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
umask 077
|
|
[[ $(uname -m) == x86_64 ]] || { echo 'This pinned JDK requires Linux x86_64' >&2; exit 1; }
|
|
[[ $(uname -s) == Linux ]] || exit 1
|
|
case "$JDK_DIR" in /*) ;; *) JDK_DIR="$HOME/$JDK_DIR" ;; esac
|
|
JDK_DIR=$(realpath -ms -- "$JDK_DIR")
|
|
case "$JDK_DIR" in "$HOME"/opt/*) ;; *) echo 'JDK directory must be below ~/opt/' >&2; exit 1 ;; esac
|
|
if [[ -x "$JDK_DIR/bin/java" && "$FORCE" == 0 ]]; then
|
|
grep -Eq '^JAVA_VERSION="25([.+"]|$)' "$JDK_DIR/release"
|
|
"$JDK_DIR/bin/java" -version
|
|
echo 'JDK already installed; use --force to install the pinned release.'
|
|
exit 0
|
|
fi
|
|
if [[ -e "$JDK_DIR" && ! -L "$JDK_DIR" ]]; then
|
|
echo 'Existing JDK directory is not managed by this installer; nothing replaced.' >&2
|
|
exit 1
|
|
fi
|
|
mkdir -p -- "$JDK_DIR.releases"
|
|
stage=$(mktemp -d "$JDK_DIR.releases/.install.XXXXXXXX")
|
|
link="$stage/active"
|
|
trap 'rm -rf -- "$stage"' EXIT
|
|
curl --fail --location --silent --show-error --proto '=https' --tlsv1.2 \
|
|
"$JDK_URL" -o "$stage/jdk.tar.gz"
|
|
printf '%s %s\n' "$JDK_SHA256" "$stage/jdk.tar.gz" | sha256sum -c -
|
|
mkdir "$stage/jdk"
|
|
tar -xzf "$stage/jdk.tar.gz" -C "$stage/jdk" --strip-components=1 --no-same-owner
|
|
"$stage/jdk/bin/java" -version
|
|
grep -Eq '^JAVA_VERSION="25([.+"]|$)' "$stage/jdk/release"
|
|
# Retain previous installed releases: an active JVM may still use their libraries.
|
|
release="$JDK_DIR.releases/temurin-$JDK_VERSION-$(date +%s)-$$"
|
|
mv -- "$stage/jdk" "$release"
|
|
ln -s -- "$release" "$link"
|
|
mv -Tf -- "$link" "$JDK_DIR"
|
|
printf 'Installed JDK: %s\n' "$JDK_DIR"
|