#!/usr/bin/env bash # The build-file half of the 21 -> 25 upgrade guide (ankurm.com/java-21-to-25-upgrade-guide-ai-prompts), run for real. # ./scripts/upgrade.sh -> docs/output/92-maven-release.txt, 93-gradle-toolchain.txt, 94-release-flag.txt, # 95-lombok-matrix.txt, 96-jdeps-internals.txt, 97-mockito-bytebuddy.txt # Needs Maven, Gradle 8.x and 9.x (GRADLE8 / GRADLE9), JDKs 21, 25, 26, 27 and network access to Maven Central. # In a sandbox that reaches Maven Central through a proxy, export JAVA_TOOL_OPTIONS (the proxy trust store) # before running: it is handed to Maven and Gradle below and unset for everything else by env.sh. set -uo pipefail NET_JTO="${JAVA_TOOL_OPTIONS:-}" source "$(dirname "$0")/env.sh" GRADLE8="${GRADLE8:-/opt/gradle-8.14.3}"; GRADLE9="${GRADLE9:-/opt/gradle-9.1.0}" SRC="$ROOT/lanes/src"; UP="$ROOT/lanes/upgrade"; B="$ROOT/build/upgrade"; rm -rf "$B"; mkdir -p "$B" jdk() { case "$1" in 21) echo "$JDK21";; 25) echo "$JDK25";; 26) echo "$JDK26";; 27) echo "$JDK27";; esac; } scrub() { sed -i -E "s#$ROOT##g; s#/opt/jdks/[^ ]*##g; s#/tmp/[^ ]*##g" "$@"; } # ---------- 92: Maven, the three properties from Step 1 ---------- mvnrun() { local v="$1"; rm -rf "$B/mvn$v" && cp -r "$UP" "$B/mvn$v" && cd "$B/mvn$v" \ && JAVA_HOME="$(jdk "$v")" MAVEN_OPTS="$NET_JTO" mvn -B -ntp package 2>&1 | grep -E '^\[(INFO|ERROR)\] (--- |BUILD|Compiling|Failed to execute|.*release version|Using|Building jar)|error: release' | sed -E 's/^/ /'; cd "$ROOT"; } { echo "# pom.xml sets maven.compiler.source/target/release to 25 (lanes/upgrade/pom.xml)" echo; echo "\$ mvn package (build JDK 21)"; mvnrun 21 echo; echo "\$ mvn package (build JDK 25)"; mvnrun 25 echo; echo "\$ mvn package (build JDK 27, still release 25)"; mvnrun 27 echo; echo "\$ javap -v -cp target/classes demo.App | grep 'major version'"; "$(jdk 25)/bin/javap" -v -cp "$B/mvn25/target/classes" demo.App | grep 'major version' | sed 's/^ */ /' echo; echo "\$ java -cp target/classes demo.App (JDK 25)"; "$JDK25/bin/java" -cp "$B/mvn25/target/classes" demo.App | sed 's/^/ /' echo; echo "\$ java -cp target/classes demo.App (JDK 21: the class file is newer than the JVM)"; "$JDK21/bin/java" -cp "$B/mvn25/target/classes" demo.App 2>&1 | head -2 | sed 's/^/ /' } > "$OUT/92-maven-release.txt" 2>&1 scrub "$OUT/92-maven-release.txt" # ---------- 93: Gradle, the toolchain block from Step 1 ---------- # gradlerun