# 14. The 21 to 25 lane: every claim in the hub posts, checked Prev: [13. Upgrade checklist](13-upgrade-checklist.md) · [Back to the README](../README.md) The two Java version guides on ankurm.com ([features](https://ankurm.com/java-21-to-25-lts-features/), [upgrade guide](https://ankurm.com/java-21-to-25-upgrade-guide-ai-prompts/)) make about twenty checkable claims. `scripts/lanes.sh` checks each one on JDK 21, 25, 26 and 27, plus 23 and 24 (from the `amazoncorretto:23` and `:24` images) where the question is *when* something changed. The verdicts are below; the transcripts are the proof. | Claim | Verdict | Where it changed | Transcript | |---|---|---|---| | Records, pattern-matching `switch`, virtual threads, sequenced collections from the article run unchanged on 21, 25, 26, 27 | true | final in 21 | [80](output/80-hub-examples.txt) | | Scoped values are final in 25 | true | preview in 21, final in 25 (JEP 506) | [81](output/81-scoped-values.txt) | | Structured concurrency is final in 25 | **false: still preview** | 5th preview in 25, 6th in 26, 7th in 27; `--enable-preview` is required on all three | [82](output/82-structured-not-final.txt) | | `Joiner.anySuccessfulResultOrThrow()` (the article's code) works on 26 and 27 | **false: renamed** | `anySuccessfulOrThrow()` from 26; `allSuccessfulOrThrow()` returns a `List` instead of a `Stream` from 26; a third type parameter arrives in 27 | [82](output/82-structured-not-final.txt), [89](output/89-joiner-api.txt) | | Finalization is removed by default | **false: still on** | `finalize()` still runs on 21, 25, 26 and 27 unless you pass `--finalization=disabled` | [83](output/83-finalization.txt) | | `System.setSecurityManager()` throws `UnsupportedOperationException` | true | already on 21 by default; permanent from 24 (JEP 486) | [84](output/84-security-manager.txt) | | `Thread.stop`, `suspend` and `resume` are removed | **half true** | `suspend`/`resume` compile on 21 and do not compile on 23, 24, 25 or 26; `stop()` still compiles on 25 and throws; removed in 26 | [85](output/85-thread-stop-suspend.txt), [73](output/73-removed-in-26.txt) | | `sun.misc.Unsafe` memory methods warn | true from 24 | none on 21, warning on 24 and 25 (JEP 498) | [86](output/86-unsafe-and-jni.txt) | | JNI use warns by default | true from 24 | none on 21, warning on 24 and 25 (JEP 472) | [86](output/86-unsafe-and-jni.txt) | | Virtual threads pin their carrier inside `synchronized` on "Java 21 to 24" | **false: 21 to 23** | pinned on 21 and 23, not pinned on 24, 25, 26, 27 (JEP 491) | [87](output/87-pinning.txt) | | "Java 25 ships an improved generational ZGC mode" | **misleading** | generational is the only ZGC from 24; `-XX:-ZGenerational` is ignored with a warning on 24 and 25 and rejected on 26 and 27 | [88](output/88-zgc-generational.txt) | | Reflection writing to a `final` field warns from 26 | true | silent on 25, warns on 26 and 27 (JEP 500) | [70](output/70-final-field-mutation.txt), [91](output/91-final-field-mutation-27.txt) | | Unnamed patterns and unnamed classes are final in 25 | **half true** | the underscore was final in 22 (JEP 456); compact source files with instance `main()` (JEP 512) are final in 25 | [90](output/90-unnamed-and-compact.txt) | Build-file claims (`--release`, Gradle, Lombok, Mockito, annotation processing, `jdeps`) are checked in [chapter 15](15-build-files.md). Claims about other projects came from their own pages, read on 2026-09-21, not from a run: | Claim | Verdict | Source | |---|---|---| | Spring Boot 3.4 is the first with official Java 25 support | **false** | Spring Boot 3.4.x is documented up to Java 24, 3.5.x up to Java 25, 4.1.1 up to Java 26 ([system requirements](https://docs.spring.io/spring-boot/system-requirements.html)); 27 is not listed yet | | Lombok 1.18.34 or later works on Java 25 | **false** | JDK 25 support arrived in 1.18.40 (2025-09-04), JDK 26 in 1.18.46, JDK 27 in 1.18.48 ([changelog](https://projectlombok.org/changelog)); a run confirms 1.18.34 fails on 25 ([95](output/95-lombok-matrix.txt), [chapter 15](15-build-files.md)) | | Mockito 5.12 or later is enough for Java 25 | **false** (run) | 5.12.0 and 5.17.0 cannot mock an interface on 25 or 27; 5.18.0 is the first that can ([97](output/97-mockito-bytebuddy.txt), [chapter 15](15-build-files.md)) | | Hibernate 7 requires Jakarta EE 10 | **false** | Hibernate ORM 7.0 requires Jakarta Persistence 3.2 (Jakarta EE 11) ([release page](https://hibernate.org/orm/releases/7.0/)) | The next chapter is [15](15-build-files.md), the build-file half; [12](12-lanes-25-to-29.md) carries the lane table forward to 29. `prompts/` holds the thirteen AI prompts from the two posts, one per file, corrected to match this chapter. Prev: [13. Upgrade checklist](13-upgrade-checklist.md) · [Back to the README](../README.md)