After setting up a JDK 20 CI build pipeline, numerous tests involving date/time parsing and formatting began to fail [0]. (The failing JPA tests are not specific to JDK 20.) For example, we encounter visually confusing assertion failures such as the following. org.opentest4j.AssertionFailedError: expected: "12:00 PM" but was: "12:00 PM" The expected string contains a normal space (which has always been the case prior to JDK 20); whereas, the actual string now contains a narrow non-breaking space. The cause of this is mentioned in the JDK 20 Release Notes [1] as "NBSP prefixed to a, instead of a normal space". Note, however, that the links for the first two bullet points in that section are mixed up. "NBSP prefixed to a, instead of a normal space" should point to [2]. Furthermore, the new whitespace character is not a non-breaking space (NBSP) but rather a narrow non-breaking space (NNBSP). In addition, the second bullet point should technically read "NNBSP prefixed to `a`, instead of a normal space" -- even though `a` provides limited value to most readers. The downside for the Java community is that this constitutes a breaking change for parsing and formatting date/time values that include "AM" and "PM" units (any may potentially apply to other date/time parsing/formatting scenarios). In Spring Framework's test suite we have witnessed this in conjunction with Spring's @DateTimeFormat and DateTimeFormatterFactory infrastructure as well as with Google's Gson-to-JSON support. A colleague who works at Oracle graciously informed me that one can use "legacy locale data" by supplying `-Djava.locale.providers=COMPAT` as a JVM argument, noting however that this option limits some newer functionalities (but without enumerating which new functionalities one might be missing when using this option). In any case, this commit adds that JVM argument to our Gradle toolchain builds so that our test suite passes on JDK 20, and we will continue to investigate further options for our builds and for our users. Note, however, that one must manually configure the `-Djava.locale.providers=COMPAT` JVM argument when running affected tests within an IDE. See gh-30185 [0] https://ge.spring.io/s/kmiq2bz2afafs/tests/overview?outcome=failed [1] https://jdk.java.net/20/release-notes#JDK-8284840 [2] https://unicode-org.atlassian.net/browse/CLDR-14032
Spring Framework

This is the home of the Spring Framework: the foundation for all Spring projects. Collectively the Spring Framework and the family of Spring projects are often referred to simply as "Spring".
Spring provides everything required beyond the Java programming language for creating enterprise applications for a wide range of scenarios and architectures. Please read the Overview section as reference for a more complete introduction.
Code of Conduct
This project is governed by the Spring Code of Conduct. By participating, you are expected to uphold this code of conduct. Please report unacceptable behavior to spring-code-of-conduct@pivotal.io.
Access to Binaries
For access to artifacts or a distribution zip, see the Spring Framework Artifacts wiki page.
Documentation
The Spring Framework maintains reference documentation (published and source), GitHub wiki pages, and an API reference. There are also guides and tutorials across Spring projects.
Micro-Benchmarks
See the Micro-Benchmarks wiki page.
Build from Source
See the Build from Source wiki page and the CONTRIBUTING.md file.
Continuous Integration Builds
Information regarding CI builds can be found in the Spring Framework Concourse pipeline documentation.
Stay in Touch
Follow @SpringCentral, @SpringFramework, and its team members on Twitter. In-depth articles can be found at The Spring Blog, and releases are announced via our news feed.
License
The Spring Framework is released under version 2.0 of the Apache License.