#!/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"