Skip to content

Migration Guide 3.10

Sergey Beryozkin edited this page May 2, 2024 · 15 revisions
Note

We highly recommend the use of quarkus update to update to a new version of Quarkus.

Items marked below with ⚙️ ✅ are automatically handled by quarkus update.

Flyway 10 ⚙️ ✅

We updated Quarkus to Flyway 10.

For some databases, the support that was previously part of the main artifact has been split to separate artifacts.

For instance, the PostgreSQL support has been moved to org.flywaydb:flyway-database-postgresql. If you are using Flyway with PostgreSQL, you need to add this dependency to your project.

OpenTelemetry

  • Support for traces when using the quarkus-redis-client.

  • Rest clients span names will now include operation and path, instead of only the operation part. Example: "GET /hello"

Qute REST Integration

The io.quarkus.qute.TemplateInstance is not registered as a non-blocking type anymore. Therefore, if a JAX-RS resource method returns TemplateInstance, then it will be considered blocking by default. The @io.smallrye.common.annotation.NonBlocking annotation can be used to restore the previous behavior.

Note
This change only affects applications using the Quarkus REST (formerly RESTEasy Reactive) via the quarkus-rest extension.

Quarkus Messaging

Starting from Quarkus 3.10, the execution mode for Quarkus Messaging extensions synchronous methods defaults to worker threads. For example, the following processing method will now be called by default on the worker thread instead of Vert.x I/O thread:

package org.acme;

import org.eclipse.microprofile.reactive.messaging.Incoming;
import org.eclipse.microprofile.reactive.messaging.Outgoing;

@Incoming("source")
@Outgoing("sink")
public Result process(int payload) {
  return new Result(payload);
}

It is easy to revert this behaviour, using the quarkus.messaging.blocking.signatures.execution.mode property. Possible values are worker (default), event-loop (previous behaviour) and virtual-thread.

The execution mode can still be adjusted per method, using @Blocking and @NonBlocking annotations:

package org.acme;

import io.smallrye.common.annotation.NonBlocking;

import org.eclipse.microprofile.reactive.messaging.Incoming;

@Incoming("source")
@NonBlocking`
public void consume(int payload) {
  // called on I/O thread
}

Packaging configuration ⚙️ ✅

The following properties relating to packaging have been renamed or changed. If you use these properties in your configuration, they will still work, however a warning will be printed.

Original property name

Replaced with

quarkus.package.type

For JAR builds, use quarkus.package.jar.type with a valid JAR type (one of fast-jar, uber-jar, mutable-jar, or (deprecated) legacy-jar).
For native builds, set quarkus.native.enabled to true.
For native sources builds, also set quarkus.native.sources-only to true.
JAR building can be disabled by setting quarkus.package.jar.enabled to false.

quarkus.package.create-appcds

quarkus.package.jar.appcds.enabled

quarkus.package.appcds-builder-image

quarkus.package.jar.appcds.builder-image

quarkus.package.appcds-use-container

quarkus.package.jar.appcds.use-container

quarkus.package.compress-jar

quarkus.package.jar.compress

quarkus.package.filter-optional-dependencies

quarkus.package.jar.filter-optional-dependencies

quarkus.package.add-runner-suffix

quarkus.package.jar.add-runner-suffix
Note: this configuration property generally only applies when building uber-JARs

quarkus.package.user-configured-ignored-entries

quarkus.package.jar.user-configured-ignored-entries

quarkus.package.user-providers-directory

quarkus.package.jar.user-providers-directory

quarkus.package.included-optional-dependencies

quarkus.package.jar.included-optional-dependencies

quarkus.package.include-dependency-list

quarkus.package.jar.include-dependency-list

quarkus.package.decompiler.version
quarkus.package.vineflower.version

No replacement; ignored

quarkus.package.decompiler.enabled
quarkus.package.vineflower.enabled

quarkus.package.jar.decompiler.enabled

quarkus.package.decompiler.jar-directory
quarkus.package.vineflower.jar-directory

quarkus.package.jar.decompiler.jar-directory

quarkus.package.manifest.attributes.*

quarkus.package.jar.manifest.attributes.*

quarkus.package.manifest.sections..

quarkus.package.jar.manifest.sections..

quarkus.package.manifest.add-implementation-entries

quarkus.package.jar.manifest.add-implementation-entries

OIDC UserInfo acquisition is enforced if UserInfo is injected

Starting from Quarkus 3.9.0, quarkus.oidc.authentication.user-info-required property is now automatically set to true when quarkus.oidc.UserInfo is injected in the REST endpoint.

It may cause OIDC tenant initialization failures if you use more than one OIDC tenant to secure the endpoint and some of these tenants do not support UserInfo. In such cases, set a tenant specific quarkus.oidc.<tenantid>.authentication.user-info-required property to false.