Add migration-17-25 module: Java 17 class files run on 17 and 25, flags, removed APIs, jdeps and jdeprscan

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Gth99spB1CzQmBFofXmU4Z
This commit is contained in:
Claude
2026-09-28 08:42:19 +00:00
parent 814c32b5ce
commit 57a04dc393
20 changed files with 304 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# Which JVM options from Java 17-era startup scripts still work? Runs `java <flag> -version` on both JDKs; records exit code and first warning/error line.
J17=${JDK17:-/tmp/tools/j17}; J25=${JDK25:-/tmp/tools/jdk-25.0.4.1+1}
echo "# flag | JDK 17 | JDK 25 (exit code: first warning or error line)"
for f in -Djava.security.manager=allow -XX:+UseBiasedLocking -XX:+UseConcMarkSweepGC -XX:+AggressiveOpts -XX:MaxPermSize=128m -XX:+UseParallelOldGC -Xverify:none -XX:-UseCompressedClassPointers -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication; do
line="$f |"
for j in "$J17" "$J25"; do
all=$("$j/bin/java" $f -version 2>&1); rc=$?
msg=$(echo "$all" | grep -E 'Unrecognized|warning|Error' | head -1 | sed 's/^OpenJDK 64-Bit Server VM warning: //' | cut -c1-120)
[ -z "$msg" ] && msg="(no message)"
line="$line exit $rc: $msg |"
done
echo "${line% |}"
done
+74
View File
@@ -0,0 +1,74 @@
#!/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"