Calling Calendar.computeTime()
with a Japanese
Imperial Calendar for a Calendar.ERA
field value that
is too large now throws IllegalArgumentException
instead of ArrayIndexOutOfBoundsException
. Thus, any
operations requiring time recomputation for a Japanese Imperial
Calendar are now affected. For example, at the time of this release
note, new
Calendar.Builder().setCalendarType("japanese").set(Calendar.ERA,
6).build()
now throws
IllegalArgumentException
.
JDK 25 Early-Access Release Notes
This is a draft of the release notes that will accompany JDK 25. The contents are subject to change until release.
Build 13
Japanese Imperial Calendar Exception Change for Era too Large (JDK-8350646)
Build 12
java.io.File treats the empty pathname as the current user directory (JDK-8024695)
The java.io.File
class is changed so that an
instance of File
created from the empty abstract
pathname ("") now behaves consistently like a File
created from the current user directory. Long standing behavior was
for some methods to fail for the empty pathname. The change means
that the canRead
, exists
and
isDirectory
methods return true
instead
of failing with false
, and the
getFreeSpace
, lastModified
and
length
methods return the expected values instead of
zero. Methods such as setReadable
and
setLastModified
will attempt to change the file's
attributes instead of failing. WIth this change,
java.io.File
now matches the behavior of the
java.nio.file
API.
Changes to the Default Time Zone Detection on Debian-based Linux (JDK-8345213)
On Debian-based Linux distributions such as Ubuntu, the
/etc/timezone
file was previously used to determine
the JDK's default time zone (TimeZone.getDefault()
).
According to
Debian's Wiki, /etc/localtime
is now the primary
source for the system's default time zone, making
/etc/timezone
redundant. As a result, the JDK's
default time zone detection logic has been updated to use
/etc/localtime
instead of /etc/timezone
.
If /etc/localtime
and /etc/timezone
are
inconsistent for any reason, the JDK's default time zone is now
determined solely based on /etc/localtime
file.
Build 11
Added API Note on Validating Signers to the getCertificates and getCodeSigners Methods of JarEntry and JarURLConnection (JDK-8347946)
An API note has been added to the getCertificates()
method of the java.util.jar.JarEntry
and
java.net.JarURLConnection
classes and the
getCodeSigners()
method of the JarEntry
class recommending that the caller should perform further
validation steps on the code signers that signed the JAR file, such
as validating the code signer's certificate chain, and determining
if the signer should be trusted.
In addition, the JarURLConnection.getCertificates()
method has been updated to specify the order of the returned array
of certificates. It is the same order as specified by
java.util.jar.JarEntry.getCertificates()
.
Build 8
Distrust TLS Server Certificates Anchored by Camerfirma Root Certificates and Issued After April 15, 2025 (JDK-8346587)
The JDK will stop trusting TLS server certificates issued after April 15, 2025 and anchored by Camerfirma root certificates, in line with similar plans announced by Google, Mozilla, Apple, and Microsoft.
TLS server certificates issued on or before April 15, 2025 will continue to be trusted until they expire. Certificates issued after that date, and anchored by any of the Certificate Authorities in the table below, will be rejected.
The restrictions are enforced in the JDK implementation (the
SunJSSE
Provider) of the Java Secure Socket Extension
(JSSE) API. A TLS session will not be negotiated if the server's
certificate chain is anchored by any of the Certificate Authorities
in the table below and the certificate has been issued after April
15, 2025.
An application will receive an exception with a message indicating the trust anchor is not trusted, for example:
"TLS Server certificate issued after 2025-04-15 and anchored by a distrusted legacy Camerfirma root CA: CN=Chambers of Commerce Root - 2008, O=AC Camerfirma S.A., SERIALNUMBER=A82743287, L=Madrid (see current address at www.camerfirma.com/address), C=EU"
The JDK can be configured to trust these certificates again by
removing "CAMERFIRMA_TLS" from the
jdk.security.caDistrustPolicies
security property in
the java.security
configuration file.
The restrictions are imposed on the following Camerfirma Root certificates included in the JDK:
Distinguished Name | SHA-256 Fingerprint |
---|---|
CN=Chambers of Commerce Root, OU=http://www.chambersign.org, O=AC Camerfirma SA CIF A82743287, C=EU |
0C:25:8A:12:A5:67:4A:EF:25:F2:8B:A7:DC:FA:EC:EE:A3:48:E5:41:E6:F5:CC:4E:E6:3B:71:B3:61:60:6A:C3 |
CN=Chambers of Commerce Root - 2008, O=AC Camerfirma S.A., SERIALNUMBER=A82743287, L=Madrid (see current address at www.camerfirma.com/address), C=EU |
06:3E:4A:FA:C4:91:DF:D3:32:F3:08:9B:85:42:E9:46:17:D8:93:D7:FE:94:4E:10:A7:93:7E:E2:9D:96:93:C0 |
CN=Global Chambersign Root - 2008, O=AC Camerfirma S.A., SERIALNUMBER=A82743287, L=Madrid (see current address at www.camerfirma.com/address), C=EU |
13:63:35:43:93:34:A7:69:80:16:A0:D3:24:DE:72:28:4E:07:9D:7B:52:20:BB:8F:BD:74:78:16:EE:BE:BA:CA |
You can also use the keytool
utility from the JDK
to print out details of the certificate chain, as follows:
keytool -v -list -alias <your_server_alias> -keystore <your_keystore_filename>
If any of the certificates in the chain are issued by one of the root CAs in the table above are listed in the output you will need to update the certificate or contact the organization that manages the server.
Removal of old JMX System Properties (JDK-8344966, JDK-8344969, JDK-8344976, JDK-8345045, JDK-8345048, JDK-8345049)
Some very old JMX System Properties have been removed. These were compatibility aids that were intended as transitional, for later removal. New behaviour will be the same as current behaviour with the property unset. The removals are:
jmx.extend.open.types
which was provided to aid
compatibility, since overriding
javax.management.openmbean.OpenType.getClassName() was made illegal
in JDK 6.
jmx.invoke.getters
introduced in JDK 6 for
compatibility with code which depended on previous incorrect
behaviour, calling invoke on getters and setters.
jdk.jmx.mbeans.allowNonPublic
which was introduced
in JDK 8 for compatibility with previous incorrect behaviour where
it was not enforced that MBean and MXBean interfaces must be
public.
jmx.mxbean.multiname
which was introduced in JDK 7
for compatibility with code which may have depended on previous
incorrect behaviour relating to multiple registrations of an MXBean
object.
jmx.tabular.data.hash.map
which was for
compatibility with JDK 1.3 clients due to use of LinkedHashMap.
jmx.remote.x.buffer.size
as a System Property and a
JMX environment property. The correct name was always
jmx.remote.x.notification.buffer.size
and was correct
from JDK 6, but the alternate name was recognised to aid
compatibility.
New Methods on BodyHandlers and BodySubscribers To Limit The Number of Response Body Bytes Accepted By The HttpClient (JDK-8328919)
Two new methods
java.net.http.HttpResponse.BodyHandlers.limiting(BodyHandler
downstreamHandler, long capacity)
and
java.net.http.HttpResponse.BodySubsribers.limiting(BodySubscriber
downstreamSubscriber, long capacity)
are added to the
HttpClient
API. These methods extend an existing
BodyHandler
or BodySubscriber
with the
ability to limit the number of response body bytes that the
application is willing to accept in response to an HTTP request.
Upon reaching the limit when reading the response body, an
IOException
will be raised and reported to the
downstream subscriber. The subscription will be cancelled, and any
further response body bytes will be discarded. This makes it
possible for the application to control the maximum amount of bytes
that it wants to accept from the server.
Build 6
java.util.zip.Inflater
and
java.util.zip.Deflater
Enhanced To Implement
AutoCloseable
(JDK-8225763)
java.util.zip.Inflater
and
java.util.zip.Deflater
now implement
AutoCloseable
and can be used with the
try-with-resources statement. Applications could previously invoke
the end()
method to release the resources held by the
Inflater
/Deflater
instance. Now, either
the end()
or the close()
method can be
invoked to do the same.
jpackage No Longer Includes Service Bindings by Default for Generated Run-Time Images (JDK-8345185)
Starting with JDK 25, jpackage
will no longer
include service bindings for a run-time image that it creates.
Prior to JDK 25, jpackage
would include service
bindings for run-time images. As a result, the generated run-time
images produced by jpackage
might not include the same
set of modules as it did in prior versions.
The previous behavior can be achieved with jpackage
of JDK 25 by adding the --bind-services
jlink
option to the default jlink
options
jpackage
uses:
jpackage [...] --jlink-options
"--strip-native-commands --strip-debug --no-man-pages --no-header-files --bind-services"
Added TLSv1.3 and CNSA 1.0 Algorithms to Implementation Requirements (JDK-8283795)
TLSv1.3 and CNSA 1.0 algorithms have been added to the list of cryptographic requirements all Java SE implementations must support. All cryptographic algorithms that are needed to implement the TLSv1.3 cipher suites and signature mechanisms and that are defined by RFC 8446 as MUST or SHOULD requirements have been added. All algorithms that are required by CNSA 1.0 have also been added. No required algorithms or protocols are being removed at this time.
The following requirements have been added to the Security Algorithm Implementation Requirements section of the Java Security Standard Algorithm Names specification and to the class summary of each of the APIs below.
-
AlgorithmParameters
- ChaCha20-Poly1305
- EC with secp256r1 or secp384r1 curves
- RSASSA-PSS with MGF1 mask generation function and SHA-256 or SHA-384 hash algorithm
-
Cipher
- AES/GCM/NoPadding with 256 bit key size
- ChaCha20-Poly1305
-
KeyAgreement
- ECDH with secp256r1 or secp384r1 curves
- X25519
-
KeyFactory
- EC
- RSASSA-PSS
- X25519
-
KeyGenerator
- AES with 256 bit key size
- ChaCha20
-
KeyPairGenerator
- DH with 3072 bit key size
- EC with secp256r1 or secp384r1 curves
- RSA with 3072 bit key size
- RSASSA-PSS with 2048, 3072, 4096 bit key sizes
- X25519
-
MessageDigest
- SHA-384
-
Signature
- RSASSA-PSS with MGF1 mask generation function and SHA-256 or SHA-384 hash algorithm
- SHA256WithECDSA with secp256r1 curve
- SHA384WithECDSA with secp384r1 curve
- SHA384WithRSA
-
SSLContext
- TLSv1.3
Build 5
The default thread pool used for asynchronous channel operations now uses innocuous threads (JDK-8345432)
The default thread pool for the system-wide default
AsynchronousChannelGroup
is changed to create threads
that do not inherit anything from threads that initiate
asynchronous I/O operations. Historically, threads in the default
thread pool inherited the Thread Context ClassLoader (TCCL) and
inheritable-ThreadLocal
s from the first thread to
initiate an asynchronous I/O operation. The change in this release
avoids potential memory leak and retention issues that arose when a
TCCL or a thread local kept a large graph of objects reachable.
Build 3
Update XML Security for Java to 3.0.5 (JDK-8344137)
The XML Signature implementation has been updated to Santuario
3.0.5. Support for four new SHA-3 based ECDSA
SignatureMethod
algorithms have been added:
SignatureMethod.ECDSA_SHA3_224
,
SignatureMethod.ECDSA_SHA3_256
,
SignatureMethod.ECDSA_SHA3_384
, and
SignatureMethod.ECDSA_SHA3_512
.