Skip to main content

Java

Jakarta EE 11 for Spring Developers: What Actually Matters

If you write Spring for a living, “Jakarta EE 11” sounds like somebody else’s problem: application servers, EJBs, a different world. Yet every Spring Boot 4 application already runs on pieces of it — the servlet API under the web server, the persistence API under Hibernate, the validation API under @NotNull. When Jakarta EE 11 shipped, most of it arrived in your project without a headline. This article separates what actually changed in those pieces from what merely got a new number. It does that by reading the real API jars — EE 10 next to EE 11 — and Spring Boot’s own version list, rather than the marketing summary. You only need to know that Jakarta EE is a family of standard Java APIs and that Spring uses several of them. Versions and status. Spring Boot 4.1.1 (Spring Framework 7.0.9, Tomcat 11.0.24, Hibernate 7.4.5), JDK 25.0.4, Maven 3.9. Jakarta jars compared: Servlet 6.0.0→6.1.0, Persistence 3.1.0→3.2.0, Validation 3.0.0→3.1.0, Annotations 2.1.1→3.0.0, Concurrency 3.0.0→3.1.1, plus Data 1.0.2. Companion code: spring-boot-demo/jakarta-ee-11.

Automating javax → jakarta and Boot 3 → 4 Upgrades with OpenRewrite

Every Spring team eventually faces the same afternoon: change javax. to jakarta. in four hundred files, rewrite the security configuration, rename a dozen properties, and then do it again for the next major version. It is dull, error-prone work, and it is exactly what a tool called OpenRewrite is for. OpenRewrite reads your source into a tree, applies recipes — small, named, repeatable edits — and writes the result back, formatting intact. You run it as a Maven plugin. This article runs it for real on a deliberately old application, shows every line it changed, and, more usefully, lists what it left for you. You need to know what Maven is and what a Spring Boot upgrade involves; nothing about OpenRewrite. Versions and status. rewrite-maven-plugin 6.46.1, rewrite-spring 6.37.1, rewrite-migrate-java 3.42.1. Legacy app: Spring Boot 2.7.18 on JDK 17.0.20, Maven 3.9. Recipes moved it to Boot 3.5.16 and then 4.0.8; I bumped the last step to 4.1.1 by hand. One legacy application with one test is a demonstration, not a survey — your codebase will find things this one does not. Companion code: spring-boot-demo/openrewrite.

Hibernate 8 and Jakarta Persistence 4.0 Preview: What Will Break

A 205-test Hibernate suite run against Hibernate 8.0.0.Beta3 and Jakarta Persistence 4.0.0-M7: the classpath trap, the Spring blocker, removed APIs, a binary-compatibility break and the runtime changes that did and did not reproduce. Preview article, updated at GA.

Lazy Constants in JDK 27 (JEP 531): Replacing Double-Checked Locking

Java's LazyConstant (JEP 531, third preview in JDK 27) against the holder idiom and double-checked locking: the API run on JDK 25, 26 and 27, the failure rule that changed between 26 and 27, List, Map and Set.ofLazy, a JMH benchmark, and why it is not yet for shipped code.