Quarkus 3.35 - JAR tree-shaking, PGO for native, Semeru AOT, @Transactional for Hibernate Reactive, and more

We’re pleased to announce the release of Quarkus 3.35.

This release brings several notable features:

  • #53295 - JAR tree-shaking to eliminate unused classes

  • #53278 - Profile-Guided Optimization (PGO) support for native builds

  • #53339 - Semeru AOT support

  • #51063 - Support @Transactional for Hibernate Reactive

  • #53432 - CORS support for the management interface

  • #52919 - Remove the use of System Properties to propagate configuration in tests

  • New snapshot distribution infrastructure

Update

To update to Quarkus 3.35, we recommend updating to the latest version of the Quarkus CLI and run:

quarkus update

Note that quarkus update can update your applications from any version of Quarkus (including 2.x) to Quarkus 3.35.

For more information about the adjustments you need to make to your applications, please refer to the Quarkus 3.35 migration guide.

What’s new?

JAR tree-shaking

A new experimental quarkus.package.jar.tree-shake option enables build-time dependency tree-shaking. When set to classes, Quarkus performs bytecode reachability analysis to identify and exclude unused classes from runtime dependencies, reducing application JAR size.

The analysis traces references through supertypes, annotations, ServiceLoader entries, reflective class loading, and more.

As an example, running tree-shaking on the Quarkus CLI removes over 6,000 unreachable classes, saving around 18 MB (39.5%).

This feature supports fast-jar, uber-jar, legacy-jar, and aot-jar packaging types.

As mentioned, this new feature is experimental, and feedback is highly welcome!

Profile-guided optimization for native builds

You can now opt in to Profile-Guided Optimization (PGO) for native builds by setting quarkus.native.pgo.enabled=true.

Note that PGO is a feature of Oracle GraalVM and is not available in GraalVM Community Edition.

When enabled, Quarkus uses your integration tests as the workload to profile the application. The resulting PGO data is then fed into the native compilation for better runtime performance.

The implementation follows a similar pattern to the Project Leyden AOT support introduced in Quarkus 3.32.

Semeru AOT support

Building on the Project Leyden AOT integration from Quarkus 3.32, Quarkus now also supports IBM Semeru’s AOT features.

In initial testing on the rest-json quickstart with IBM Semeru Runtime Open Edition 25, startup time was cut roughly in half (from ~380 ms down to ~190 ms).

For now, this is limited to building JARs with Semeru AOT, automatic container image building (as available with Leyden) is not yet supported.

@Transactional for Hibernate Reactive

Quarkus now supports the @Transactional annotation for Hibernate Reactive, thanks to a new quarkus-reactive-transactions extension.

This means you can use the familiar @Transactional annotation on methods that return Uni, and the transaction lifecycle (begin, commit, rollback) will be managed within the reactive pipeline.

A few things to keep in mind:

  • Only TxType.REQUIRED is currently supported.

  • Mixing @Transactional with @WithTransaction or @WithSessionOnDemand is not allowed.

  • Methods annotated with @Transactional are no longer automatically considered @Blocking. If your method is blocking but returns Uni, you now need an explicit @Blocking annotation. See the migration guide for details.

CORS support for the management interface

The management interface now has its own dedicated CORS configuration, allowing you to set CORS policies independently from the main HTTP interface.

Testing improvements

The test infrastructure no longer uses System Properties to propagate configuration from Dev Services, Test Resources, and Test Profiles. This change opens the door for better parallel test execution (which we hope to achieve at some point in the future) and makes the Config system truly immutable.

Tests using QuarkusDevModeTest, QuarkusIntegrationTest, or QuarkusMainIntegrationTest can now declare a Config field or method parameter to access the updated configuration.

New snapshot distribution

Quarkus snapshots are no longer published to Sonatype, which had reliability issues with the volume of artifacts involved. Snapshots are now published daily as GitHub Releases in the quarkusio/quarkus-ecosystem-ci repository, with version 999-SNAPSHOT. Each release contains a maven-repo.tar.gz asset with pre-built Maven artifacts that you can extract into your local Maven repository.

For CI setups, a dedicated GitHub Action is also available.

More details can be found in the Using snapshots section of the contributing guide.

Jackson reflection-free serializers for Quarkus REST

We initially planned to make Jackson reflection-free serializers the default for Quarkus REST in 3.35. However, thanks to several community members who tested this feature and reported issues, we identified a number of edge cases that still need to be addressed. We decided to postpone making it the default to 3.36, so that we can fix these issues first.

We are very grateful to everyone who took the time to report problems, your feedback is what makes Quarkus better.

In the meantime, we very much welcome more testing from our community. You can enable reflection-free serializers by adding the following property to your configuration:

quarkus.rest.jackson.optimization.enable-reflection-free-serializers=true

Please report any issues you encounter on GitHub.

Platform updates

Various Platform components were upgraded including:

  • Camel Quarkus to 3.35.0

  • Quarkus CXF to 3.35.1 - see release notes for 3.35.0 and 3.35.1

  • Quarkus Amazon Services to 3.18.0

  • Quarkus MCP Server to 1.12.0

  • Quarkus Flow to 0.9.0

Full changelog

You can get the full changelog of 3.35.0.CR1, 3.35.0, and 3.35.1 on GitHub.

Contributors

The Quarkus community is growing and has now 1188 contributors. Many many thanks to each and everyone of them.

In particular for the 3.35 release, thanks to Ales Justin, Alexey Loubyansky, andreatp, Andy Damevin, anuragg-saxenaa, Arseni Buinitski, Aurea Munoz, Aurélien Pupier, Bruno Baptista, brunobat, Carles Arnal, Cesar M. Romero-Pedraza, Chris Laprun, Chris Ruffalo, Clement Escoffier, Cristiano Nicolai, DerFrZocker, Dmitri Bourlatchkov, Faisal Dilawar, Foivos Zakkak, George Gastaldi, Georgios Andrianakis, Guillaume Smet, Holly Cummins, Inaki Villar, Jakub Jedlicka, Jamal Dabari, Jan Martiska, Jens Teglhus Møller, Julien Ponge, Karm Michal Babacek, Katia Aresti, keshavprashatdeshpande, Ladislav Thon, lberrymage, Luca Molteni, marco sappe griot, mariofusco, marko-bekhta, Martin Kouba, Matej Novotny, Matej Vašek, Max Rydahl Andersen, Maximilian Zellhofer, Melloware, Michael Edgar, Michal Maléř, Michal Vavřík, Mihajlo Veljković, Nick Robison, Nico Hinrichs, Ozan Gunalp, Paramvir Jindal, Phillip Kruger, Phillip Krüger, PreetiYadav, Robert Toyonaga, Roberto Cortez, Rolfe Dlugy-Hegwer, Rostislav Svoboda, Sergey Beryozkin, Simon Scatton, Simon Scholz, Stéphane Épardaud, Teymur Babayev, Thomas Segismont, tiwari91, Tiziano Basile, tom, xstefank, Yoann Rodière, and Yoshikazu Nojima.

Come Join Us

We value your feedback a lot so please report bugs, ask for improvements…​ Let’s build something great together!

If you are a Quarkus user or just curious, don’t be shy and join our welcoming community: