#!/usr/bin/env bash # Regenerates output/. Needs JDK 17 and JDK 25 (set JDK17 / JDK25), and, for 06, the openrewrite module's legacy app from spring-boot-demo (LEGACY_APP). # The probes are compiled ONCE with JDK 17 (--release 17) and run unchanged on both runtimes: that is the "direct jump" scenario. set -uo pipefail cd "$(dirname "$0")/.." J17=${JDK17:-/tmp/tools/j17}; J25=${JDK25:-/tmp/tools/jdk-25.0.4.1+1}; OUT=$PWD/output; C=/tmp/migration-17-25-work; rm -rf "$C"; mkdir -p "$C" "$OUT" export JDK17=$J17 JDK25=$J25 "$J17/bin/javac" -encoding UTF-8 --release 17 -Xlint:-options -nowarn -d "$C/c17" src/probes/*.java 2>/dev/null q() { grep -v -E '^Picked up'; } { echo "# 01-runtime-behaviour: classes compiled once with JDK 17 (--release 17), run unchanged on 17 and 25; LC_ALL=C" for p in SecurityManagerProbe ThreadStopProbe CharsetProbe FinalizerProbe UnsafeProbe; do echo "--- $p" for j in "$J17" "$J25"; do v=$("$j/bin/java" -version 2>&1 | q | head -1 | sed -E 's/^openjdk version "([^"]+)".*/\1/') LC_ALL=C "$j/bin/java" -cp "$C/c17" $p 2>&1 | q | sed "s/^/ [$v] /" done done echo "--- SecurityManagerProbe with -Djava.security.manager=allow" for j in "$J17" "$J25"; do v=$("$j/bin/java" -version 2>&1 | q | head -1 | sed -E 's/^openjdk version "([^"]+)".*/\1/') LC_ALL=C "$j/bin/java" -Djava.security.manager=allow -cp "$C/c17" SecurityManagerProbe 2>&1 | q | head -3 | sed "s/^/ [$v] /" done } > "$OUT/01-runtime-behaviour.txt" ./scripts/flags.sh > "$OUT/02-startup-flags.txt" 2>&1 { echo "# 03-compile-removed-apis: javac -Xlint:removal on JDK 17 and JDK 25" for f in src/removed/*.java; do for j in "$J17" "$J25"; do v=$("$j/bin/java" -version 2>&1 | q | head -1 | sed -E 's/^openjdk version "([^"]+)".*/\1/') r=$("$j/bin/javac" -encoding UTF-8 -Xlint:removal -d "$C/x" "$f" 2>&1 | q | grep -E 'error:|warning:' | head -1 | sed -E 's/^[^ ]+ (error|warning): //') printf '%-28s [%s] %s\n' "$(basename "$f")" "$v" "${r:-compiles cleanly}" done done } > "$OUT/03-compile-removed-apis.txt" "$J17/bin/jar" cf "$C/probes.jar" -C "$C/c17" . { echo "# 04-jdeps-jdeprscan (scanning probes.jar, built by JDK 17, with the JDK 25 tools)" echo "--- jdeps --jdk-internals"; "$J25/bin/jdeps" --jdk-internals "$C/probes.jar" 2>&1 | q | sed -n '1,2p' echo "--- jdeprscan --release 17 --for-removal"; "$J25/bin/jdeprscan" --release 17 --for-removal "$C/probes.jar" 2>&1 | q | sed 's/^Jar file .*/Jar file probes.jar:/' echo "--- jdeprscan --release 25 --for-removal"; "$J25/bin/jdeprscan" --release 25 --for-removal "$C/probes.jar" 2>&1 | q | sed 's/^Jar file .*/Jar file probes.jar:/' } > "$OUT/04-jdeps-jdeprscan.txt" { echo "# 05-gc-defaults (no flags, same 2-CPU machine)" for j in "$J17" "$J25"; do v=$("$j/bin/java" -version 2>&1 | q | head -1 | sed -E 's/^openjdk version "([^"]+)".*/\1/') echo "--- JDK $v" "$j/bin/java" -XX:+PrintFlagsFinal -version 2>/dev/null | grep -E ' (UseG1GC|MaxHeapSize|InitialHeapSize|UseCompactObjectHeaders) ' | awk '{print " " $2, $3, $4}' "$j/bin/java" -cp "$C/c17" DefaultsProbe 2>&1 | q | sed 's/^/ /' done } > "$OUT/05-gc-defaults.txt" # The four apps come from spring-boot-demo/openrewrite: legacy-app is checked in, step1..step3 are produced by its scripts/run-all.sh under $OR_WORK. LEG=${LEGACY_APP:-/tmp/spring-boot-demo/openrewrite/legacy-app}; ORW=${OR_WORK:-/tmp/or-work} { echo "# 06-legacy-stack-on-25: mvn test on JDK 25 for four generations of the same app (bytecode target is release 17 in every row)" for row in "Spring Boot 2.7.18 (Spring 5.3, Hibernate 5.6)|$LEG" "Spring Boot 3.5.16|$ORW/step1" "Spring Boot 4.0.8|$ORW/step2" "Spring Boot 4.1.1|$ORW/step3"; do name=${row%%|*}; dir=${row#*|} if [ -d "$dir" ]; then rm -rf "$C/app"; cp -r "$dir" "$C/app"; rm -rf "$C/app/target" r=$(cd "$C/app" && JAVA_HOME=$J25 PATH=$J25/bin:$PATH mvn -B test 2>&1 | grep -E 'Tests run:.*Fail|BUILD' | grep -v 'Time elapsed' | sed 's/\[INFO\] //' | tr '\n' ' ') printf '%-52s %s\n' "$name:" "$r" else printf '%-52s %s\n' "$name:" "(not found: $dir)"; fi done } > "$OUT/06-legacy-stack-on-25.txt" cat > "$OUT/07-framework-minimums.txt" <<'EOT' # 07-framework-minimums (quoted from vendor documentation on 2026-09-28; NOT produced by running code) Spring Boot 4.1.1 system requirements (https://docs.spring.io/spring-boot/system-requirements.html): "Spring Boot 4.1.1 requires at least Java 17 and is compatible with versions up to and including Java 26." Spring Framework 7.0.9 or above; Maven 3.6.3 or later; Gradle 8.14 or later, and 9.x Gradle Java compatibility (https://docs.gradle.org/current/userguide/compatibility.html), "support for running Gradle": Java 21: 8.5 and after | Java 24: 8.14 and after | Java 25: 9.1.0 and after | Java 26: 9.4.0 and after EOT ls -1 "$OUT"; rm -rf "$C"