Quarkus 3.40 LTS Core Final shipped on September 23. It is the last long-term support release on the 3.x line before Quarkus 4 arrives in November with a rewritten I/O core, Jackson 3, and a minimum Java 21 baseline. If your team is still on Quarkus 3.33 or older, the time to move is now — 3.40 is the stable runway you want under your feet before that migration lands.
Leyden AOT Cuts Startup by Up to 63% — on Java 25 Only
The headline improvement in 3.40 is Project Leyden AOT caching, and the numbers are real. The SwiftShop benchmark saw median readiness time fall from 1,022 milliseconds to 380 milliseconds after enabling the JDK 25 AOT cache — a 63 percent reduction. Across workloads, the median improvement is around 49 percent.
Leyden works by recording a training run of your application and writing an AOT configuration file. Subsequent runs load that file and skip the class-loading, linking, and JIT compilation work the JVM would otherwise repeat on every cold start. No GraalVM, no native image, no native compilation — the same JAR, running on the same JVM.
# Training run (once per build artifact)
java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconf -jar app.jar
# Production run
java -XX:AOTMode=load -XX:AOTConfiguration=app.aotconf -jar app.jar
There is a hard prerequisite: Leyden AOT caching requires Java 25. Upgrading Quarkus to 3.40 while staying on Java 21 gives you the framework improvements but none of the startup gains. If your container images are still pinned to Java 21, plan the JVM upgrade as part of the same sprint.
JUnit 6 and Testcontainers 2: Run the Update Command First
Quarkus 3.40 carries the JUnit 5 to JUnit 6 and Testcontainers 2 upgrades that landed in Quarkus 3.31. Both involve artifact and package renames that will break your build if handled manually. The automated path is simpler:
quarkus update --stream=3.40
Running this handles the BOM version bump, renames quarkus-junit5 to quarkus-junit, updates Testcontainers artifact coordinates, and applies the new Quarkus Maven packaging type if you opt in. If you prefer manual control, the key rename is: every quarkus-*-junit5 artifact becomes quarkus-*-junit in your pom.xml or build.gradle. The package names inside JUnit 6 also change, so import statements break silently if you only update the artifact name without updating your imports.
Signal Event Bus: The Right Way to Do In-Process Messaging
The Signal extension — quarkus-signals — is stable in 3.40 and resolves a long-standing problem: three separate, incompatible eventing APIs (CDI events, the Vert.x event bus, and Reactive Messaging) that each solve part of the problem but do not compose cleanly. Signal is type-safe, async by default, and explicit about delivery semantics. You declare whether you are broadcasting, dispatching work to a single handler, or expecting a response.
Signal replaces the Vert.x event bus entirely in Quarkus 4. Adopting it in 3.40 is migration prep, not just a preference. If you are using CDI events or the Vert.x event bus for in-process messaging today, start evaluating quarkus-signals now.
Panache Next Is the New Default for Data Access
Panache Next, stable in 3.40, unifies blocking and reactive Hibernate and adds first-class support for Jakarta Data 1.0. Type-safe query annotations are validated at build time, which catches mistakes that classic Panache pushed to runtime. Existing Panache code continues to work unchanged — the migration is opt-in.
For new Quarkus projects starting today, Panache Next is the recommended path. For existing services, there is no urgent pressure, but migrating before Quarkus 4 reduces the surface area of that eventual upgrade.
Upgrade Strategy: Move to 3.40 Before Quarkus 4 Lands
Quarkus 4 Beta 1 is September 2026. GA is November. The breaking changes are substantial: Vert.x 5.1.2 and Netty 4.2 replace the core I/O layer, Jackson 3 changes APIs that most applications depend on directly or transitively, and Java 17 support is dropped. Teams migrating from 3.27 or 3.33 directly to 4.0 will manage multiple breaking changes simultaneously.
The better path: upgrade to 3.40 LTS now, stabilize, then plan a deliberate 4.0 migration in Q1 2027 when the ecosystem has settled. Quarkus 3.40 is supported until September 2027, which gives you a year of runway without being pinned to an outdated release.
Key Takeaways
- Quarkus 3.40 LTS Core Final shipped September 23, 2026. Full platform announcement is September 30.
- Leyden AOT caching delivers up to 63 percent startup improvement — but requires Java 25. Upgrade both or gain neither.
- Run
quarkus update --stream=3.40to handle the JUnit 6 and Testcontainers 2 renames automatically. - Signal replaces the Vert.x event bus in Quarkus 4 — evaluate
quarkus-signalsnow if you use in-process messaging. - Quarkus 4 GA is November 2026 with major breaking changes. 3.40 is the stable LTS to land on before that migration.













