Hello David,
I ran the Ant testsuite against JDK 26 EA build 26-ea+28-2790 and there
weren't any related failures.
https://ci-builds.apache.org/job/Ant/job/Ant%20Master%20Linux%20(latest%20EA%20JDK)/63/
-Jaikiran
On 08/12/25 2:39 pm, David Delabassee via dev wrote:
Welcome to the final OpenJDK Quality Outreach update of 2025!
JDK 26, scheduled for General Availability on March 17, 2026, is now in
Rampdown Phase One[1]. At this stage, the overall JDK 26 feature set is frozen,
and only low-risk enhancements may still be considered. I would like to thank
the projects that raised issues addressed in this release: JUnit, jOOQ, PDFBox,
and Maven.
You will find below the list of JEPs integrated into JDK 26. One JEP that
stands out is JEP 517, which introduces HTTP/3 support to the HTTP Client API.
Supporting HTTP/3 is an important advancement. It should also be noted that
adding this feature to the platform was a significant undertaking; the HTTP/3
pull request is the largest OpenJDK PR in recent years. The JDK Networking team
encourages you to try out this new feature (see the related Heads-up below).
Another JEP that stands out is JEP 504, as the Applet API has finally been
removed from the platform. We do not expect this to cause any disruption, as
applets are no longer used and this change was announced well in advance. For
more background on this effort, please refer to this article[2].
Looking ahead, the next milestone is in early February, when the first JDK 26
Release Candidate builds will be available. This means we have a few weeks,
excluding the end-of-year break, to identify and hopefully address any issues
your projects might encounter. If you experience any problems with the JDK
early-access builds, please let us know as soon as possible.
I will conclude this update with a quick note on JavaOne, as registration has
just opened. If you plan to attend J1, please let me know. It would be great to
meet in person and discuss the Quality Outreach program.
[1] https://mail.openjdk.org/pipermail/jdk-dev/2025-December/010662.html
[2] https://inside.java/2025/12/03/applet-removal/
# Heads-Up - JDK 26: HTTP/3 Support in HTTP Client API
JEP 517 introduces support for HTTP/3 in the HTTP Client API. While HTTP/3
offers similar features to HTTP/2 at the protocol level, its key distinction is
that it runs over the QUIC protocol using UDP, whereas HTTP/2 and HTTP/1.1
operate over TCP.
If your code requests HTTP/3 but it is not available, the client will downgrade
to HTTP/2 or HTTP/1.1 instead. However, if your code tries to enforce HTTP/3
exclusively, a failed attempt will result in an exception.
For the first request to a server, the client tries both HTTP/2 (TCP) and
HTTP/3 (UDP) and uses whichever connects first. Subsequently, HttpClient uses
the “Alt-Svc” mechanism to learn which protocols the server supports, so future
requests can use HTTP/3 if supported. For additional details, be sure to check
these resources[3][4].
## Call to Action
Although the enhancements to the HTTP Client API appear simple on the surface,
supporting HTTP/3 on top of QUIC is the result of several years of dedicated
development effort by the JDK Networking team. As this implementation is still
new, we encourage you to download the JDK 26 early-access builds, try out this
feature, and share your feedback on the net-dev[5] mailing list (registration
required).
[3] https://inside.java/2025/10/30/quality-heads-up/
[4] https://inside.java/2025/10/22/http3-support/
[5] https://mail.openjdk.org/mailman/listinfo/net-dev
# Heads-Up - JDK 26: HttpClient Supports TLS Named Groups & Signature Schemes
Java applications can configure TLS constraints on
`javax.net.ssl.SSLParameters` during the setup of new connections. However,
until now, HttpClient ignored the named groups and signature schemes set on
SSLParameters. Starting with JDK 26, `java.net.http.HttpClient` preserves the
signature schemes and named groups configured via SSLParameters when
negotiating the TLS handshake. For more information, check this resource[6].
[6] https://inside.java/2025/11/26/quality-heads-up/
# Heads-Up - JDK 25: Consistent Behavior of 'new File("")'
On JDK 24 and earlier, the behavior of a `File` instance created from an empty string
(e.g., `var file = new File("")`) was inconsistent. When queried using methods
like `file.exists()` and `file.isDirectory()`, it appeared to be non-existent because
both returned false. Similarly, methods such as `canRead()` returned false, while
`length()`, `lastModified()`, etc. returned 0.
When transformed into an instance representing the absolute path (e.g., `var file = new
File("").getAbsoluteFile()`), the behavior changes: the previously mentioned methods now return meaningful
results. This is because `new File("").getAbsoluteFile()` maps to the current user directory, and the File
API behaves accordingly. Since both `new File("")` and `new File("").getAbsoluteFile()` should
represent the same file system entry, this inconsistency is jarring and can be surprising.
The newer API in `java.nio.file` avoids this issue and treats both `Path.of("")` and
`Path.of("").toAbsolutePath()` as the current user directory. For example, both
`Files.exists(Path.of(""))` and `Files.exists(Path.of("").toAbsolutePath())` return true.
JDK 25 fixed this long-standing inconsistency: `new File("")` now properly represents the
current user directory, so for `var file = new File("")`, methods like `file.exists()`
and `file.isDirectory()` return true. The `File` Javadoc[7] was updated to spell out the intended
behavior.
For more details, check JDK-8024695[8].
## Call To Action
Code that relies on the old behavior is often found in unit tests (e.g., to intentionally create non-existent
files with `new File("")`) or in cases where user input is mapped to file system entries (e.g., to
treat "no user entry" and "invalid user entry" the same: as an absent file. In such
cases, the change may manifest as issues related to file arguments or configuration.
While fixing such code should be straightforward, identifying it may not be, so
a thorough test suite is helpful. For dependencies and tools, it is recommended
to rely on their tests and statements regarding JDK 25 compatibility, as only
they can address potential issues. There is no way to restore the inconsistent
behavior of JDK 24 and earlier.
[7]
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/io/File.html
[8] https://bugs.openjdk.org/browse/JDK-8024695
# JDK 26 Early-Access Builds
The JDK 26 early-access builds 27 are available[9]. You can review the Release
Notes here[10].
## JEPs integrated into JDK 26:
- JEP 500: Prepare to Make Final Mean Final
- JEP 504: Remove the Applet API
- JEP 516: Ahead-of-Time Object Caching with Any GC
- JEP 517: HTTP/3 for the HTTP Client API
- JEP 522: G1 GC: Improve Throughput by Reducing Synchronization
- JEP 524: PEM Encodings of Cryptographic Objects (2nd Preview)
- JEP 525: Structured Concurrency (6th Preview)
- JEP 526: Lazy Constants (2nd Preview)
- JEP 529: Vector API (11th Incubator)
- JEP 530: Primitive Types in Patterns, instanceof, and switch (4th Preview)
## Changes in recent JDK 26 builds that may be of interest:
- JDK-8208693: HttpClient: Extend the request timeout's scope to cover the
response body
- JDK-8365675: Add String Unicode Case-Folding Support
- JDK-8371470: Java Launcher does not fail when running compact java-file with
private no-arg constructor
- JDK-8251928: [macos] the printer DPI always be 72, cause some content lost
when print out
- JDK-8268613: jar --validate should check inital entries of a JAR file
- JDK-8366424: Missing type profiling in generated Record Object methods
- JDK-8347831: Re-examine version check when cross linking
- JDK-8373023: Remove the default value of InitialRAMPercentage
- JDK-8325448: Hybrid Public Key Encryption
- JDK-8353749: Improve security warning when using JKS or JCEKS keystores
- JDK-8371259: ML-DSA AVX2 and AVX512 intrinsics and improvements
- JDK-8346944: Update Unicode Data Files to 17.0.0
- JDK-8368527: JMX: Add an MXBeans method to query GC CPU time
- JDK-8371960: Missing null check in AnnotatedType annotation accessor methods
- JDK-8349732: Add support for JARs signed with ML-DSA
- JDK-8354548: Update CLDR to Version 48.0
- JDK-8369517: Compilation mismatch for equivalent lambda and method reference
- JDK-8370813: Deprecate AggressiveHeap
- JDK-8370843: Deprecate AlwaysActAsServerClassMachine and
NeverActAsServerClassMachine
- JDK-8366577: Deprecate java.net.Socket::setPerformancePreferences
- JDK-8212084: G1: Implement UseGCOverheadLimit
- JDK-8368856: Add a method that performs saturating addition of a Duration to
an Instant
- JDK-8343232: Support for PBMAC1 protection on PKCS12 keystores
- JDK-8369346: Remove default value of and deprecate the MaxRAM flag
- JDK-8362637: Convert java.nio.ByteOrder to an enum
- JDK-8369238: Allow virtual thread preemption on some common class
initialization paths
- JDK-8364361: [process] java.lang.Process should implement Closeable
- JDK-8334015: Add Support for UUID Version 7 (UUIDv7) defined in RFC 9562
- JDK-8366575: Remove SDP support
- JDK-8370387: Remove handling of InterruptedIOException from java.io classes
- JDK-7105350: HttpExchange's attributes are the same as HttpContext's
attributes
- JDK-8370057: Correct scale handling of BigDecimal.sqrt
- JDK-8358942: HttpClient adds Content-Length: 0 for a GET request with a
BodyPublishers.noBody()
Note: A more exhaustive list of changes can be found here[11].
[9] https://jdk.java.net/26/
[10] https://jdk.java.net/26/release-notes
[11] https://github.com/openjdk/jdk/compare/jdk-26+20...jdk-26+27
# Valhalla Early-Access Builds
Project Valhalla early-access builds implementing JEP 401 (Value Classes and
Objects (Preview)) are available[12]. The goal of these builds is to establish
a milestone and solicit feedback as we work toward integrating this
functionality into the JDK. More information can be found in the feature
documentation[13], in this article[14], and in this video[15]. Feedback can be
sent to the valhalla-dev mailing[16] list (registration required).
[12] https://jdk.java.net/valhalla/
[13] https://openjdk.org/projects/valhalla/value-objects
[14] https://inside.java/2025/10/27/try-jep-401-value-classes/
[15] https://youtu.be/Eua3nTkye2Y
[16] https://mail.openjdk.org/mailman/listinfo/valhalla-dev
# JavaFX Direct3D 12 Early-Access Builds
The early-access JavaFX builds implementing the new Direct3D 12 graphics
rendering pipeline for Windows x64 are now available[17]. The goal of this EA
build is to solicit feedback as we work toward integrating this functionality
into JavaFX. Feedback can be sent to the openjfx-dev[18] mailing list
(registration required).
[17] https://jdk.java.net/javafxdirect3d12/
[18] https://mail.openjdk.org/mailman/listinfo/openjfx-dev
# Topics of Interest
- All Features in Java 26 - Inside Java Newscast
https://inside.java/2025/12/04/newscast-102/
- Java 26 Warns of Deep Reflection - Inside Java Newscast
https://inside.java/2025/11/20/newscast-101/
- HTTP/3 Support in JDK 26
https://inside.java/2025/10/22/http3-support/
- So Long and Thanks for All the Applets
https://inside.java/2025/12/03/applet-removal/
- “From Cowboy Mode to Careful Stewardship” with Mark Reinhold - Inside Java
Podcast
https://inside.java/2025/10/27/podcast-041/
- “Amber & Valhalla - Incremental Design and Feature Arcs” with Brian Goetz -
Inside Java Podcast
https://inside.java/2025/09/28/podcast-040/
- Value Classes Heap Flattening - What to expect from JEP 401 #JVMLS
https://inside.java/2025/10/31/jvmls-jep-401/
- Help, My Java Object Vanished (and the GC is Not at Fault)
https://arraying.de/posts/markword/
- Symbolic Modeling and Transformation of Java Code #JVMLS
https://inside.java/2025/11/22/jvmls-symbolic-modelling-java-transformation/
- Beyond the Vector API - A Quest for a Lower Level API #JVMLS
https://inside.java/2025/11/16/jvmls-vector-api/
- Serialization 2.0: A Marshalling Update!
https://inside.java/2025/11/10/devoxxbelgium-serialization2-0-marshalling-update/
- Pulling the (Foreign) String
https://cr.openjdk.org/~mcimadamore/panama/strings_ffm.html
- NUMA-Aware Relocation in ZGC
https://joelsiks.com/posts/zgc-numa-aware-relocation/
- Garbage Collection in Java: Choosing the Correct Collector
https://inside.java/2025/11/29/devoxxbelgium-choose-correct-gc/
- Evolving ZGC's Pointer Color Palette #JVMLS
https://inside.java/2025/10/06/jvmls-zgc-colored-pointers/
- Three Upcoming G1 Improvements
https://inside.java/2025/10/23/newscast-99/
- JDK 25 Security Enhancements
https://seanjmullan.org/blog/2025/09/23/jdk25
- Performance Improvements in JDK 25
https://inside.java/2025/10/20/jdk-25-performance-improvements/
~
As always, ping me if you find any issues while testing your project(s) with
the latest JDK early-access builds. And as the year-end is fast approaching,
let me wish you all the best for the upcoming holidays. See you in 2026 with
Java 26, Java 27, and hopefully some of you in person at JavaOne 2026!
PS: Please let me know if you don't want to receive these OpenJDK Quality
Outreach updates anymore.
--David
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]