The full picture
- Jakarta blast radius: not your imports alone — old Tomcat-dependent libs, servlet filters in internal libraries, JAXB usage, swagger/springfox (dead; move to springdoc), older APM agents. Run the OpenRewrite recipes, but budget for the stragglers.
- Observability shift:
ObservationAPI means one instrumentation produces metrics and traces; adopt via starters (micrometer-tracing + OTLP export). If your platform predates it, plan the Sleuth removal explicitly. - AOT/native decision: AOT processing happens at build; closed-world constraints (reflection/resources/proxies need hints) mean library compatibility drives feasibility. Sweet spot: CLI tools, scale-to-zero/serverless, sidecars. Long-running JVM services usually keep C2's peak throughput instead.
- Cadence governance: Boot minors ship ~6-monthly with ~13-month OSS support per line — 'stay current' must be a scheduled program (Renovate + a quarterly bump train), not an aspiration; 2.x is already end-of-OSS-support.
| Feature | Version | Lead-level takeaway |
|---|---|---|
| Jakarta EE 9/10 namespace | 3.0 | The migration cost center — audit libs first |
| Native image GA support | 3.0 | Per-service decision, not a fleet mandate |
| Virtual threads property | 3.2 | spring.threads.virtual.enabled=true — measure, then default for I/O services |
| RestClient / JdbcClient | 3.2 | Retire RestTemplate patterns without going reactive |
| Structured logging / CDS out-of-box | 3.4/3.3 | Cheap wins for ops and startup |