#!/bin/bash set -e JAVA_VERSION="${1:-11}" JVM_DIR="$(cd "$(dirname "$0")/jvms" && pwd)" MODULES="java.base,java.desktop,java.logging,java.sql,java.xml,java.naming,java.management,jdk.unsupported" CORRETTO_BASE_URL="https://corretto.aws/downloads/latest" build_linux_x64() { local platform="linux-x64" local url="${CORRETTO_BASE_URL}/amazon-corretto-${JAVA_VERSION}-x64-linux-jdk.tar.gz" local archive="${JVM_DIR}/corretto${JAVA_VERSION}-${platform}.tar.gz" local extract_dir="${JVM_DIR}/tmp-${platform}" local jre_dir="${JVM_DIR}/jre-${platform}" echo "=== Building $platform ===" echo "Downloading..." curl -L -o "$archive" "$url" echo "Extracting..." rm -rf "$extract_dir" "$jre_dir" mkdir -p "$extract_dir" tar -xzf "$archive" -C "$extract_dir" --strip-components=1 echo "Creating minimal JRE..." "$extract_dir/bin/jlink" \ --no-header-files \ --no-man-pages \ --compress=2 \ --add-modules "$MODULES" \ --output "$jre_dir" rm -rf "$extract_dir" echo "Done: $(du -sh "$jre_dir" | cut -f1)" echo "" } build_windows_x64() { local platform="windows-x64" local url="${CORRETTO_BASE_URL}/amazon-corretto-${JAVA_VERSION}-x64-windows-jdk.zip" local archive="${JVM_DIR}/corretto${JAVA_VERSION}-${platform}.zip" local extract_dir="${JVM_DIR}/tmp-${platform}" local jre_dir="${JVM_DIR}/jre-${platform}" local host_jdk="${JVM_DIR}/tmp-linux-x64" echo "=== Building $platform ===" if [ ! -d "$host_jdk" ]; then echo "Downloading host JDK for jlink..." local host_archive="${JVM_DIR}/corretto${JAVA_VERSION}-linux-x64.tar.gz" curl -L -o "$host_archive" "${CORRETTO_BASE_URL}/amazon-corretto-${JAVA_VERSION}-x64-linux-jdk.tar.gz" mkdir -p "$host_jdk" tar -xzf "$host_archive" -C "$host_jdk" --strip-components=1 fi echo "Downloading..." curl -L -o "$archive" "$url" echo "Extracting..." rm -rf "$extract_dir" "$jre_dir" mkdir -p "$extract_dir" unzip -q "$archive" -d "$extract_dir" local jdk_dir=$(find "$extract_dir" -maxdepth 1 -type d -name "jdk*" | head -1) local jmods_path="$jdk_dir/jmods" echo "Creating minimal JRE..." "$host_jdk/bin/jlink" \ --no-header-files \ --no-man-pages \ --compress=2 \ --add-modules "$MODULES" \ --module-path "$jmods_path" \ --output "$jre_dir" rm -rf "$extract_dir" echo "Done: $(du -sh "$jre_dir" | cut -f1)" echo "" } build_windows_arm64() { echo "=== Building windows-arm64 ===" echo "ERROR: Windows ARM64 JDK is not available from Amazon Corretto" echo "Skipping..." echo "" } build_macos_x64() { local platform="macos-x64" local url="${CORRETTO_BASE_URL}/amazon-corretto-${JAVA_VERSION}-x64-macos-jdk.tar.gz" local archive="${JVM_DIR}/corretto${JAVA_VERSION}-${platform}.tar.gz" local extract_dir="${JVM_DIR}/tmp-${platform}" local jre_dir="${JVM_DIR}/jre-${platform}" local host_jdk="${JVM_DIR}/tmp-linux-x64" echo "=== Building $platform ===" if [ ! -d "$host_jdk" ]; then echo "Downloading host JDK for jlink..." local host_archive="${JVM_DIR}/corretto${JAVA_VERSION}-linux-x64.tar.gz" curl -L -o "$host_archive" "${CORRETTO_BASE_URL}/amazon-corretto-${JAVA_VERSION}-x64-linux-jdk.tar.gz" mkdir -p "$host_jdk" tar -xzf "$host_archive" -C "$host_jdk" --strip-components=1 fi echo "Downloading..." curl -L -o "$archive" "$url" echo "Extracting..." rm -rf "$extract_dir" "$jre_dir" mkdir -p "$extract_dir" tar -xzf "$archive" -C "$extract_dir" local jdk_dir=$(find "$extract_dir" -maxdepth 1 -type d -name "jdk*" -o -name "amazon-corretto*" | head -1) local jmods_path="$jdk_dir/Contents/Home/jmods" if [ ! -d "$jmods_path" ]; then jmods_path="$jdk_dir/jmods" fi echo "Creating minimal JRE..." "$host_jdk/bin/jlink" \ --no-header-files \ --no-man-pages \ --compress=2 \ --add-modules "$MODULES" \ --module-path "$jmods_path" \ --output "$jre_dir" rm -rf "$extract_dir" echo "Done: $(du -sh "$jre_dir" | cut -f1)" echo "" } build_macos_arm64() { local platform="macos-arm64" local url="${CORRETTO_BASE_URL}/amazon-corretto-${JAVA_VERSION}-aarch64-macos-jdk.tar.gz" local archive="${JVM_DIR}/corretto${JAVA_VERSION}-${platform}.tar.gz" local extract_dir="${JVM_DIR}/tmp-${platform}" local jre_dir="${JVM_DIR}/jre-${platform}" local host_jdk="${JVM_DIR}/tmp-linux-x64" echo "=== Building $platform ===" if [ ! -d "$host_jdk" ]; then echo "Downloading host JDK for jlink..." local host_archive="${JVM_DIR}/corretto${JAVA_VERSION}-linux-x64.tar.gz" curl -L -o "$host_archive" "${CORRETTO_BASE_URL}/amazon-corretto-${JAVA_VERSION}-x64-linux-jdk.tar.gz" mkdir -p "$host_jdk" tar -xzf "$host_archive" -C "$host_jdk" --strip-components=1 fi echo "Downloading..." curl -L -o "$archive" "$url" echo "Extracting..." rm -rf "$extract_dir" "$jre_dir" mkdir -p "$extract_dir" tar -xzf "$archive" -C "$extract_dir" local jdk_dir=$(find "$extract_dir" -maxdepth 1 -type d -name "jdk*" -o -name "amazon-corretto*" | head -1) local jmods_path="$jdk_dir/Contents/Home/jmods" if [ ! -d "$jmods_path" ]; then jmods_path="$jdk_dir/jmods" fi echo "Creating minimal JRE..." "$host_jdk/bin/jlink" \ --no-header-files \ --no-man-pages \ --compress=2 \ --add-modules "$MODULES" \ --module-path "$jmods_path" \ --output "$jre_dir" rm -rf "$extract_dir" echo "Done: $(du -sh "$jre_dir" | cut -f1)" echo "" } main() { mkdir -p "$JVM_DIR" local target="${2:-all}" echo "Building JREs for Java $JAVA_VERSION" echo "Modules: $MODULES" echo "Target: $target" echo "" case "$target" in linux-x64) build_linux_x64 ;; windows-x64) build_windows_x64 ;; windows-arm64) build_windows_arm64 ;; macos-x64) build_macos_x64 ;; macos-arm64) build_macos_arm64 ;; all) build_linux_x64 build_windows_x64 build_macos_x64 build_macos_arm64 ;; *) echo "Unknown target: $target" echo "Valid targets: linux-x64, windows-x64, macos-x64, macos-arm64, all" echo "Note: windows-arm64 is not available from Corretto" exit 1 ;; esac echo "=== Summary ===" for platform in linux-x64 windows-x64 macos-x64 macos-arm64; do local jre_dir="${JVM_DIR}/jre-${platform}" if [ -d "$jre_dir" ]; then local size=$(du -sh "$jre_dir" | cut -f1) echo "$platform: $size" fi done rm -rf "${JVM_DIR}/tmp-linux-x64" } main "$@"