이 콘텐츠는 선택한 언어로 제공되지 않습니다.
Migrating applications to Red Hat build of Quarkus 3.20
Abstract
Providing feedback on Red Hat build of Quarkus documentation 링크 복사링크가 클립보드에 복사되었습니다!
To report an error or to improve our documentation, log in to your Red Hat Jira account and submit an issue. If you do not have a Red Hat Jira account, then you will be prompted to create an account.
Procedure
- Click the following link to create a ticket.
- Enter a brief description of the issue in the Summary.
- Provide a detailed description of the issue or enhancement in the Description. Include a URL to where the issue occurs in the documentation.
- Clicking Submit creates and routes the issue to the appropriate documentation team.
Chapter 1. Migrating applications to Red Hat build of Quarkus 3.20 링크 복사링크가 클립보드에 복사되었습니다!
As an application developer, you can migrate applications that are based on Red Hat build of Quarkus version 3.2 or later to version 3.20 by using either the quarkus CLI or Maven.
The Quarkus CLI is intended for development purposes, including tasks such as creating, updating, and building Quarkus projects. However, Red Hat does not support using the Quarkus CLI in production environments.
1.1. Updating projects to the latest Red Hat build of Quarkus version 링크 복사링크가 클립보드에 복사되었습니다!
To update your Red Hat build of Quarkus projects to the latest version, follow these steps, which are explained in detail later in this guide:
-
Use the
quarkusCLI or Maven commands to run automated update tasks. - Consult the Changes that affect compatibility with earlier versions section to perform any manual update tasks.
1.1.1. Automatic updates 링크 복사링크가 클립보드에 복사되었습니다!
Running the quarkus CLI or Maven commands triggers OpenRewrite recipes that upgrade project dependencies and source code. This automated approach provides a convenient and reliable way to update your projects.
However, not all migration tasks are automated. If specific updates are not applied after running the quarkus update command or its Maven equivalent, consider the following possible reasons:
- The required migration task is not covered by the available OpenRewrite recipes.
- An extension your project depends on is incompatible with the latest Red Hat build of Quarkus version.
1.1.2. Manual updates 링크 복사링크가 클립보드에 복사되었습니다!
Manual updates give you the flexibility and control to address any migration tasks to ensure your project aligns with your specific needs. Tasks that are not automated must be handled manually.
For a list of the migration tasks required to update from the previous release to this one, see the Changes That Affect Compatibility with Earlier Versions section of this guide.
Reviewing the migration guide for each release version between the current version of your application project and the version you’re upgrading to is essential. This review process ensures you are fully informed and prepared for the update process. For example, if upgrading from version 3.15 to 3.20, you only need to review this guide. If you are upgrading from version 3.2 to 3.20, you must also review the guides for for each intermediate version:
Each task in this migration guide outlines the required changes and indicates whether they are automatically handled by the quarkus update command and its Maven equivalent.
For additional background, see the Quarkus community Migration guides.
1.2. Using the quarkus CLI to update the project 링크 복사링크가 클립보드에 복사되었습니다!
Update your Red Hat build of Quarkus projects by using the quarkus CLI.
The Quarkus CLI is intended for development purposes, including tasks such as creating, updating, and building Quarkus projects. However, Red Hat does not support using the Quarkus CLI in production environments.
Prerequisites
- An IDE
-
JDK 17 or 21 installed and
JAVA_HOMEconfigured - Apache Maven 3.9.9
- Optional: To build native Linux executables, Red Hat build of Quarkus supports using the Red Hat build of Quarkus Native Builder image (quarkus/mandrel-for-jdk-21-rhel8), which is based on GraalVM Mandrel.
-
The
quarkusCLI 3.20.5 - A project based on Red Hat build of Quarkus version 3.2 or later
Procedure
- Create a working branch for your project in your version control system.
-
Install the latest version of the
quarkusCLI by following the installation guide. Verify the installation by running the following command:
quarkus -v 3.20.5
quarkus -v 3.20.5Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Important: Configure the extension registry client as instructed in the "Configuring Red Hat build of Quarkus extension registry client" section of the "Getting Started with Red Hat build of Quarkus" guide.
- In the terminal, navigate to your project directory.
Update the project:
quarkus update
quarkus updateCopy to Clipboard Copied! Toggle word wrap Toggle overflow Optional: To update to a specific stream, use the
--streamoption followed by a specific version; for example:quarkus update --stream=3.20
quarkus update --stream=3.20Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Review the output from the update command for instructions and perform any suggested tasks.
- Use a diff tool to inspect all changes made during the update process.
- Manually perform any changes that were not handled by updating the project. For details, refer to the following Changes that affect compatibility with earlier versions section.
- Ensure the project builds without errors, all tests pass, and the application functions as expected before deploying to production.
1.3. Using Maven to update the project 링크 복사링크가 클립보드에 복사되었습니다!
Update your Red Hat build of Quarkus projects by using Maven.
Prerequisites
- An IDE
-
JDK 17 or 21 installed and
JAVA_HOMEconfigured - Apache Maven 3.9.9
- Optional: To build native Linux executables, Red Hat build of Quarkus supports using the Red Hat build of Quarkus Native Builder image (quarkus/mandrel-for-jdk-21-rhel8), which is based on GraalVM Mandrel.
- A project based on Red Hat build of Quarkus version 3.2 or later
Procedure
- Create a working branch for your project in your version control system.
- Important: Configure the extension registry client as detailed in the "Configuring Red Hat build of Quarkus extension registry client" section of the "Getting Started with Red Hat build of Quarkus" guide.
- Open a terminal and navigate to your project directory.
Ensure that the Red Hat build of Quarkus Maven plugin version is aligned with the latest supported version. Configure the project according to the "Getting started with Red Hat build of Quarkus" guide, and then run:
mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.20.5.redhat-00001:update
mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.20.5.redhat-00001:updateCopy to Clipboard Copied! Toggle word wrap Toggle overflow Optional: To update to a specific stream, use the
-Dstreamoption followed by the desired version; for example:mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.20.5.redhat-00001:update -Dstream=3.20
mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.20.5.redhat-00001:update -Dstream=3.20Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Review the output from the update command for any instructions and perform the suggested tasks.
- Use a diff tool to examine all changes made during the update process.
- Manually perform any changes that were not handled by updating the project. For details, refer to the following Changes that affect compatibility with earlier versions section.
- Ensure the project builds without errors, all tests pass, and the application functions as expected before deploying to production.
1.4. Changes that affect compatibility with earlier versions 링크 복사링크가 클립보드에 복사되었습니다!
This section describes changes in Red Hat build of Quarkus 3.20 that affect the compatibility of applications built with earlier product versions.
Review these breaking changes and take the necessary steps to ensure that your applications continue functioning after updating them to Red Hat build of Quarkus 3.20.
You can perform many of the updates listed in this section by running quarkus update or the equivalent Maven command. This triggers automated OpenRewrite recipes that update your project dependencies and source code to the latest Red Hat build of Quarkus version.
However, not all migration tasks are automated. If specific updates aren’t applied by the automated update, it might be because the required migration task isn’t covered by the available OpenRewrite recipes or an extension your project relies on is incompatible with the latest version. In such cases, you need to perform the updates manually. Be sure to review the following items to identify and address any manual migration tasks.
1.4.1. Cloud 링크 복사링크가 클립보드에 복사되었습니다!
1.4.1.1. OpenShift and Kubernetes: Fabric8 Kubernetes Client upgraded to version 7.2 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, the following extensions upgrade the Fabric8 Kubernetes Client from version 6.13 to 7.2.
-
quarkus-openshift -
quarkus-openshift-client -
quarkus-kubernetes -
quarkus-kubernetes-client
Breaking changes
The upgraded Fabric8 Kubernetes Client includes breaking changes affecting the quarkus-kubernetes-client and quarkus-openshift-client extensions.
Although the quarkus-openshift and quarkus-kubernetes extensions use Fabric8, their functionality remains unchanged, so you do not need to make any updates for them.
The io.quarkus:quarkus-test-openshift-client module has been removed as part of this upgrade. If your tests use this module, migrate to io.quarkus:quarkus-test-kubernetes-client, which offers equivalent functionality. For more information, see the OpenShift client section of the Quarkus "Kubernetes Client" guide.
The upgraded Fabric8 Kubernetes Client reorganized some model types and classes, moving some to different modules. To find their new locations, refer to the official Fabric8 Kubernetes Client: Migration from 6.x to 7.x guide.
Review your application for any affected dependencies, configurations, or API usages, and update them as needed. Then, thoroughly test your application to ensure full compatibility with Fabric8 7.2.
Red Hat build of Quarkus 3.20 provides Developer Preview support for the quarkus-kubernetes extension, and does not currently support the quarkus-kubernetes-client extension. However, if you use these extensions, the described change might affect your migration.
This change requires manual intervention. It is not included in the automated update process described in the Migrating applications to Red Hat build of Quarkus 3.20 guide.
1.4.2. Compatibility 링크 복사링크가 클립보드에 복사되었습니다!
1.4.2.1. Removal of Reactive rename compatibility layer 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.15, many extensions and configuration properties were renamed as part of the rebranding of RESTEasy Reactive to Quarkus REST and Reactive Messaging to Quarkus Messaging. To support this transition, artifact relocations and configuration fallbacks were introduced.
In Red Hat build of Quarkus 3.20, these artifact relocations and configuration fallbacks have been removed. You must now use the new artifact names and configuration properties.
For more additional background information, see the RESTEasy Reactive extensions renamed to Quarkus REST section of the "Release Notes for Red Hat build of Quarkus 3.15" guide.
1.4.3. Core 링크 복사링크가 클립보드에 복사되었습니다!
1.4.3.1. Default locale configuration enhanced 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat build of Quarkus 3.20 updates locale handling to align with Mandrel version 24.2 and later.
Breaking changes
In earlier releases, applications inherited the default locale from the build system.
To ensure consistent locale behavior across all applications, Red Hat build of Quarkus applies a standardized default locale strategy. Use the following table to determine how your application’s behavior changes based on your locale configuration.
| Application properties | Locales included in native executable | Default locale at run time |
|---|---|---|
|
Neither |
|
|
|
Only |
Locales listed in |
|
|
Only |
|
Value of |
|
Both |
Locales listed in |
Value of |
The en_US locale is always embedded in the native executable, regardless of the quarkus.locales configuration.
If you set quarkus.default-locale, Red Hat build of Quarkus sets the user.language and user.country system properties at run time. For JDK 24 and later with GraalVM or Mandrel, you can also override these properties directly.
Review your application’s locale settings in the configuration properties and, if necessary, update the settings to avoid unexpected changes in behavior.
This change requires manual intervention. It is not included in the automated update process described in the Migrating applications to Red Hat build of Quarkus 3.20 guide.
In Red Hat build of Quarkus 3.20, the configuration properties for @Fallback.fallbackMethod() and @BeforeRetry.methodName() are now resolved at build time and cannot be changed at runtime. The affected configuration properties are:
-
<class_name>/<method_name>/Fallback/fallbackMethod -
<class_name>/Fallback/fallbackMethod -
Fallback/fallbackMethod -
<class_name>/<method_name>/BeforeRetry/methodName -
<class_name>/BeforeRetry/methodName -
BeforeRetry/methodName
This change ensures proper reflection configuration and compatibility with native image compilation.
1.4.3.3. SmallRye Fault Tolerance version 6.7.0 deprecates first-generation programmatic API 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, the quarkus-smallrye-fault-tolerance extension includes SmallRye Fault Tolerance 6.7.0, which introduces no breaking changes but includes the following updates:
-
The first version of the programmatic API (
FaultTolerance,@ApplyFaultTolerance) is deprecated and planned for removal in SmallRye Fault Tolerance 7.0. The second version (Guard,TypedGuard,@ApplyGuard) serves as a replacement, but there are notable differences. - Specification-defined configuration properties remain available, but Red Hat build of Quarkus now provides native configuration properties you can use instead.
For more information, see the SmallRye Fault Tolerance 6.7.0 release announcement, which includes links to the migration guides for the programmatic API and details about the new configuration properties. The Quarkus SmallRye Fault Tolerance guide provides a complete reference for these configuration properties.
1.4.3.4. Scheduler methods now require a started scheduler 링크 복사링크가 클립보드에 복사되었습니다!
Starting in Red Hat build of Quarkus 3.20, the behavior of methods in io.quarkus.scheduler.Scheduler has changed.
When the scheduler is not started, almost all methods now throw an UnsupportedOperationException.
To verify whether the scheduler is running, you can use a new method, Scheduler#isStarted().
This change affects scheduler instances coming from both the quarkus-scheduler and quarkus-quartz extensions.
1.4.3.5. Management interface now listens on localhost in development and test modes 링크 복사링크가 클립보드에 복사되었습니다!
Starting in Red Hat build of Quarkus 3.20, when you use development and test modes, the management interface listens on the localhost interface by default instead of on 0.0.0.0. This change aligns with the behavior of the main interface.
On Windows with Windows Subsystem for Linux (WSL), both the management and main interfaces continue to listen on 0.0.0.0.
For more information, see the Quarkus Management interface reference guide.
1.4.3.6. Migration to @ConfigMapping and deprecation of configuration classes 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, configuration has migrated to the @ConfigMapping framework. This change deprecates the legacy configuration classes in favor of a unified configuration model based on interfaces and method signatures.
A compatibility layer remains in place for certain commonly used configuration classes, but it is planned for removal in a future release.
1.4.3.7. Builder and runtime base images upgraded to UBI 9 링크 복사링크가 클립보드에 복사되었습니다!
Starting in Red Hat build of Quarkus 3.20, Red Hat builder and runtime base images are upgraded to use Red Hat Universal Base Image 9 (UBI 9).
When upgrading from UBI 8 to UBI 9, be aware that changes in system dependencies, native image builds, or package and GNU C Library (glibc) version updates might affect your application’s behavior or runtime environment. Review and update your configurations as needed.
If you encounter issues with UBI 9, you can manually switch back to using UBI 8:
| Images | Actions |
|---|---|
| Builder images | Set the builder image manually as follows:
|
| Runtime images | Depending on the mode, apply the following settings:
|
For more information, see the following resources:
1.4.4. Data 링크 복사링크가 클립보드에 복사되었습니다!
1.4.4.1. Datasource: Removal of implicit default URL for reactive SQL datasources 링크 복사링크가 클립보드에 복사되었습니다!
In earlier versions of Red Hat build of Quarkus, when Dev Services were disabled or running in production mode, the quarkus.datasource.reactive.url and quarkus.datasource.<datasource-name>.reactive.url properties were implicitly set to an undocumented default, targeting localhost with a database-specific port.
Starting in Red Hat build of Quarkus 3.20, these properties no longer have a default value when Dev Services are disabled or the application is running in production mode. If the property is not set, the corresponding datasource is deactivated. If the application attempts to use a deactivated datasource, it will fail at startup. For details, see the Datasource usage fails fast if datasource is deactivated or has no URL set release note.
If your application requires an active datasource and you want it to connect to a database on localhost, you must now set the quarkus.datasource.reactive.url or quarkus.datasource.<datasource-name>.reactive.url property explicitly. For example:
quarkus.datasource.reactive.url=postgresql://localhost:5432/mydatabase
quarkus.datasource.reactive.url=postgresql://localhost:5432/mydatabase
In earlier versions, this configuration was set implicitly. Starting with this release, you must define the URL to activate the datasource.
1.4.4.2. Datasources without a URL no longer contribute to a health check 링크 복사링크가 클립보드에 복사되었습니다!
Previously, when Dev Services were disabled or in production mode, Red Hat build of Quarkus contributed a health check for datasources even if quarkus.datasource.jdbc.url, quarkus.datasource.<datasource-name>.jdbc.url, quarkus.datasource.reactive.url, or quarkus.datasource.<datasource-name>.reactive.url properties were not set. This caused unreliable health checks that always succeeded for JDBC datasources and almost always failed for reactive datasources.
Starting with Red Hat build of Quarkus 3.20, datasources without a URL no longer contribute a health check. To ensure a health check is available, explicitly set the quarkus.datasource.jdbc.url, quarkus.datasource.<datasource-name>.jdbc.url, quarkus.datasource.reactive.url, or quarkus.datasource.<datasource-name>.reactive.url property.
1.4.4.3. Datasource usage fails fast if datasource is deactivated or has no URL set 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, applications start successfully even if a datasource is deactivated with quarkus.datasource.active=false or lacks a URL. This behavior often leads to runtime failures when the datasource is first accessed, especially when Dev Services are disabled or in production mode.
With this update, applications fail to start if Red Hat build of Quarkus detects that a datasource is used but is either deactivated or missing a URL.
Red Hat build of Quarkus now enforces stricter validation during startup to catch these issues early:
-
Static CDI Injection: If a datasource is injected statically using
@Inject DataSourceor@Inject Pool, the application will fail to start with a clear and actionable error message. -
Dynamic Retrieval: Datasources retrieved dynamically, such as by using
Arc.container().instance()or@Inject Instance<DataSource>, will not be detected during startup. However, retrieving these beans at runtime will throw an explicit exception with actionable guidance.
The same validation applies to the Flyway and Liquibase extensions for their Flyway and LiquibaseFactory CDI beans.
Red Hat build of Quarkus 3.20 does not currently support the Flyway and Liquibase extensions. However, if you use these extensions, the described change might affect your migration.
Impact on Applications
If your application uses a datasource, Flyway, or LiquibaseFactory bean that may be deactivated or lack a URL, you could encounter a startup failure like the following:
io.quarkus.arc.InactiveBeanException: Bean is not active: SYNTHETIC bean [class=io.agroal.api.AgroalDataSource, id=sqqLi56D50iCdXmOjyjPSAxbLu0] Reason: Datasource' <default>' was deactivated automatically because its URL was not set.
io.quarkus.arc.InactiveBeanException: Bean is not active: SYNTHETIC bean [class=io.agroal.api.AgroalDataSource, id=sqqLi56D50iCdXmOjyjPSAxbLu0] Reason: Datasource' <default>' was deactivated automatically because its URL was not set.Copy to Clipboard Copied! Toggle word wrap Toggle overflow To activate the datasource, set configuration property
quarkus.datasource.jdbc.url.For more information, see the Configure data sources guide.
How to resolve if the datasource should be active
Ensure that all required configuration properties are set:
-
Set
quarkus.datasource.jdbc.urlor the appropriate configuration for the datasource type to ensure it is properly activated.
How to resolve if the datasource might be inactive
Adjust your code or configuration to handle inactive datasources gracefully:
Deactivate unused extensions: If an extension depends on a datasource that might not be active, deactivate the extension explicitly by setting its
activeconfiguration property tofalse. For example:-
quarkus.hibernate-search-standalone.active=false -
quarkus.hibernate-search-orm.active=false -
quarkus.hibernate-orm.active=false -
quarkus.flyway.active=false -
quarkus.datasource.active=false
-
Inject dynamically: Instead of using static CDI injection, use
@Inject InjectableInstance<DataSource>to check if the datasource bean is active before using it.if (ds.getHandle().getBean().isActive()) { DataSource dataSource = ds.get(); // Use the datasource }if (ds.getHandle().getBean().isActive()) { DataSource dataSource = ds.get(); // Use the datasource }Copy to Clipboard Copied! Toggle word wrap Toggle overflow These changes improve application reliability by detecting misconfigured datasources early, preventing unexpected runtime errors.
1.4.4.4. Flyway version 11 removes cleanOnValidationError 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, the quarkus-flyway extension upgrades Flyway to version 11, which removes the cleanOnValidationError configuration parameter. Additionally, calling Flyway.validate() no longer cleans on validation error.
To mitigate this change, Red Hat build of Quarkus 3.20 introduces the quarkus.flyway.validate-at-start.clean-on-validation-error configuration property, which provides behavior similar to cleanOnValidationError, but applies only when the application starts.
Workaround: If you require the previous behavior of cleanOnValidationError in explicit calls to Flyway.validate(), consider catching validation errors in your application and triggering a database cleanup explicitly using Flyway.clean().
Red Hat build of Quarkus 3.20 does not currently support the Flyway extension. However, if you use this extension, the described change might affect your migration.
This change requires manual intervention. It is not included in the automated update process described in the Migrating applications to Red Hat build of Quarkus 3.20 guide.
For more information, see the Quarkus Using Flyway guide.
1.4.4.5. IBM Db2 driver and container image upgraded to version 12 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, the IBM Db2 driver and container image that Dev Services uses have been upgraded to version 12.
The automated update described in the Migrating applications to Red Hat build of Quarkus 3.20 guide upgrades the IBM Db2 driver and container image to version 12.
Breaking changes
This upgrade introduces breaking changes to the license registration process and connectivity configuration.
Review the new license requirements, configuration steps, and SSL/TLS settings detailed on IBM’s Features with behavior changes when upgrading to the Db2 Connect 12.1 driver for upgrading to Db2 Connect 12.1.
This change requires manual intervention. It is not included in the automated update process described in the Migrating applications to Red Hat build of Quarkus 3.20 guide.
1.4.4.6. Hibernate ORM Bean Validation contributes to DDL by default 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, the default behavior of Hibernate ORM’s Bean Validation integration has changed. Previously, validation constraints were not considered during Data Definition Language (DDL) generation. With this release, Hibernate ORM includes applicable validation constraints in DDL by default, ensuring that database schemas align more closely with application-level constraints.
To revert to the previous behavior where validation constraints do not influence DDL generation, set the
quarkus.hibernate-orm.validation.modeconfiguration property tocallback:quarkus.hibernate-orm.validation.mode=callback
quarkus.hibernate-orm.validation.mode=callbackCopy to Clipboard Copied! Toggle word wrap Toggle overflow
The quarkus.hibernate-orm.validation.enabled property has also been deprecated.
To disable Bean Validation integration, use the following setting:
quarkus.hibernate-orm.validation.mode=none
quarkus.hibernate-orm.validation.mode=noneCopy to Clipboard Copied! Toggle word wrap Toggle overflow
For more information about these changes and guidance on migrating your application, see the Migration Guide 3.19, or the following resources:
1.4.5. Logging 링크 복사링크가 클립보드에 복사되었습니다!
1.4.5.1. quarkus.log.*.json property deprecated 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, the quarkus.log.*.json configuration property has been deprecated. To enable JSON formatting for logging, use the quarkus.log.*.json.enabled property instead.
Update your configuration as follows:
quarkus.log.console.json.enabled=true
quarkus.log.console.json.enabled=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow
This change was introduced to improve compatibility with YAML configuration, where the previous structure required using special syntax such as ~ to assign a value to the root key, leading to confusing or error-prone setups.
For more information, see the Migration Guide 3.19.
1.4.6. Observability 링크 복사링크가 클립보드에 복사되었습니다!
1.4.6.1. OpenTelemetry: Database incubating values moved 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, the quarkus-opentelemetry extension introduces breaking changes because some database incubating values, such as those related to Redis, were moved to a different package.
OpenTelemetry does not maintain a list of changes for database semantic conventions because they are not yet stable.
This change might require manual intervention, if you use manual instrumentation. It is not included in the automated update process described in the Migrating applications to Red Hat build of Quarkus 3.20 guide.
1.4.6.2. SmallRye OpenTracing: Extension and related JDBC tracing configuration removed 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, the previously deprecated quarkus-smallrye-opentracing extension and related configuration property quarkus.datasource.jdbc.tracing have been removed.
The quarkus-opentelemetry extension is now the preferred tracing solution. To enable JDBC tracing with OpenTelemetry, use the following configuration property:
quarkus.datasource.jdbc.telemetry=true
quarkus.datasource.jdbc.telemetry=true
To migrate, replace the OpenTracing extension with OpenTelemetry and update your configuration accordingly.
1.4.7. Security 링크 복사링크가 클립보드에 복사되었습니다!
1.4.7.1. OIDC Client: Behavior changed if client does not have a URL 링크 복사링크가 클립보드에 복사되었습니다!
Starting in Red Hat build of Quarkus 3.20, if you use the quarkus-oidc-client extension but do not configure the OpenID Connect (OIDC) client to point to a specific URL, Dev Services for Keycloak automatically starts in dev mode.
To disable this behavior, add the following property to your application.properties file:
quarkus.keycloak.devservices.enabled=false
quarkus.keycloak.devservices.enabled=false
1.4.7.2. Security WebAuthn: Reimplementation by using WebAuthn4J 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, the quarkus-security-webauthn extension has been reimplemented by using WebAuthn4J to enhance security, align with industry standards, and improve long-term maintainability.
As a result, this update is not compatible with previous versions of the extension.
This release note is provided for users of the quarkus-security-webauthn extension. Although Red Hat build of Quarkus 3.20 does not yet support this extension, be aware that this change may impact your migration.
To transition smoothly to the new implementation, use the following information.
userName changes
-
All
userNamereferences have been replaced withusername.
Authenticator class changes
The
Authenticatorclass (from Vert.x) is no longer used and has been replaced functionally withWebAuthnCredentialRecord. This new class holds similar data, but as a WebAuthn4J subtype, requires different methods for accessing content:-
WebAuthnCredentialRecord.getRequiredPersistedData()returns aRequiredPersistedDatarecord with all necessary persistence data, simplifying storage management. -
WebAuthnCredentialRecord.fromRequiredPersistedData(RequiredPersistedData), a static method, reconstructs aWebAuthnCredentialRecordfrom stored data.
-
-
If your application stores
Authenticatordata in JPA entities or database tables, you must migrate to the newWebAuthnCredentialRecordformat. If you encounter issues, report them in the project repository.
WebAuthnUserProvider class changes
-
findWebAuthnCredentialsByUserName()is nowfindByUsername(). -
findWebAuthnCredentialsByCredID()is nowfindByCredentialId(). updateOrStoreWebAuthnCredentials()has been split into the following:-
update(String credentialId, long counter) -
store(WebAuthnCredentialRecord credentialRecord)
-
Default endpoint changes
-
/q/webauthn/loginis now/q/webauthn/login-options-challenge. -
/q/webauthn/registeris now/q/webauthn/register-options-challenge. /q/webauthn/callbackhas been split into the following endpoints, which are turned off by default for security reasons:/q/webauthn/loginTo enable, set the
quarkus.webauthn.enable-login-endpointproperty./q/webauthn/registerTo enable, set the
quarkus.webauthn.enable-registration-endpointproperty.
-
The new
/q/webauthn/registerendpoint requires ausernamequery parameter. -
/.well-known/webauthnhas been added to return the list of allowed related origins. -
The user name for
loginandlogin-options-challengeis now optional. -
The
/q/webauthn/login-options-challengeand/q/webauthn/registerendpoints have moved fromPOSTtoGETmethods and now accept parameters as query parameters instead of JSON bodies.
WebAuthnSecurity class changes
Two methods have been added:
-
getLoginOptionsChallenge() -
getRegisterOptionsChallenge()
-
-
The
usernameparameter forlogin()andloginOptionsChallenge()is now optional. -
The
register()method now requires ausernameparameter due to the removal of the username cookie.
Configuration changes
-
quarkus.webauthn.require-resident-key(boolean, default:false) has been replaced byquarkus.webauthn.resident-key(data enumeration, default:REQUIRED). -
quarkus.webauthn.challenge-username-cookie-namesetting has been removed along with its associated cookie. The following new configuration settings have been added:
-
quarkus.webauthn.load-metadata(boolean, default:false) controls the loading of Fast Identity Online (FIDO) metadata. -
quarkus.webauthn.user-presence-required(boolean, default:true) specifies whether user presence is required.
-
-
quarkus.webauthn.user-verificationnow defaults toREQUIREDinstead ofDISCOURAGED. -
quarkus.webauthn.timeoutnow defaults to5 minutesinstead of1 minute, in accordance with the WebAuthn standard. -
quarkus.webauthn.pub-key-cred-paramsis nowquarkus.webauthn.public-key-credential-parameters. -
quarkus.webauthn.originis nowquarkus.webauthn.origins(plural) and now supports multiple origins, in accordance with the WebAuthn standard. The following new boolean configuration options have been added:
-
quarkus.webauthn.enable-registration-endpoint(boolean, default:false) enables the default registration endpoint. -
quarkus.webauthn.enable-login-endpoint(boolean, default:false) enables the default login endpoint.
-
WebAuthn credential verification changes
-
WebAuthn credential attestation verification might behave differently for
quarkus.security.webauthn.attestationsettings other thanNONE(the default).
quarkus-test-security-webauthn test module changes
-
The
WebAuthnHardwareconstructor now requires aURLparameter to represent the endpoint location. You can get this URL from your test classes by using@TestHTTPResource URL url. -
WebAuthnEndpointHelper.invokeRegistration()is nowobtainRegistrationChallenge(). -
WebAuthnEndpointHelper.invokeLogin()is nowobtainLoginChallenge()and accepts an optionalusernameparameter. WebAuthnEndpointHelper.invokeCallback()has been split into the following:-
WebAuthnEndpointHelper.invokeRegistration(), which requires ausernameparameter. -
WebAuthnEndpointHelper.invokeLogin(), which accepts an optionalusernameparameter.
-
JavaScript library changes
-
registerOnly()is nowregisterClientSteps(). -
loginOnly()is nowloginClientSteps(). -
login()andloginClientSteps()now accept an optionaluserparameter. -
The constructor parameter
registerPathis nowregisterOptionsChallengePath(default:/q/webauthn/register-options-challenge). -
The constructor parameter
loginPathis nowloginOptionsChallengePath(default:/q/webauthn/login-options-challenge). The constructor parameter
callbackPathhas been split into the following:-
registerPath(default:/q/webauthn/register) -
loginPath(default:/q/webauthn/login)
-
The constructor now accepts a
csrfoption of typeJsonObjectwith two keys:-
header, which specifies the header name used to include the Cross-Site Request Forgery Prevention (CSRF) token. value, which specifies the CSRF token value.This update improves the security of custom endpoints protected by the
quarkus-rest-csrfextension. For more information, see the Quarkus Cross-Site Request Forgery Prevention guide.
-
The status of this feature is downgraded from preview to experimental to allow for further stabilization.
For more information, see the Quarkus Using Security with WebAuthn guide.
This change requires manual intervention. It is not included in the automated update process described in the Migrating applications to Red Hat build of Quarkus 3.20 guide.
1.4.8. Tooling 링크 복사링크가 클립보드에 복사되었습니다!
1.4.8.1. @WithTestResource flaws fixed: restrictToAnnotatedClass replaced by scope 링크 복사링크가 클립보드에 복사되었습니다!
Earlier, Red Hat build of Quarkus 3.15 shipped with a version of @WithTestResource that was flawed and was thus not announced.
In Red Hat build of Quarkus 3.20, the flaws have been fixed, resulting in a breaking change. In this release, the earlier restrictToAnnotatedClass field has been replaced by scope.
1.4.8.2. JUnit 5 Mockito: Default mocking strategy changed to inline 링크 복사링크가 클립보드에 복사되었습니다!
In earlier releases, the quarkus-junit5-mockito dependency was configured to create mock objects by using the subclass mocking strategy.
Starting in Red Hat build of Quarkus 3.20, the dependency is now configured to use an inline mocking strategy by default.
1.4.8.3. Quarkus Test Framework JUnit 5 Mockito version alignment 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20.0, the quarkus-junit5-mockito dependency was temporarily non-functional due to an intentional mismatch in its dependency versions. The version of Mockito in use required JUnit 5.11 or later, but the platform included JUnit 5.10.
To resolve the issue, Red Hat build of Quarkus 3.20.1 upgrades JUnit to version 5.12.1. This update aligns the versions of JUnit and Mockito and restores compatibility for the quarkus-junit5-mockito dependency.
The impact of this update is expected to be minimal. Testing in the community and Camel Quarkus has not revealed any regressions. For more information, see the related issue: https://github.com/quarkusio/quarkus/issues/46858.
The quarkus-junit5-mockito extension is not supported or tested with the Red Hat build of Quarkus. It is mentioned here for awareness in case users have included it in their application dependencies.
Workaround
If you experience compatibility issues with JUnit 5.12.1, you can override the JUnit version in your Maven project to use the version from the Red Hat build of Quarkus 3.20.0.
To ensure consistent alignment across all JUnit artifacts, import the JUnit BOM version used in 3.20.0 as shown:
The junit-bom is not a supported test library of Red Hat build of Quarkus 3.20.0. If you choose to use the BOM to align JUnit dependencies, use the upstream version from the JUnit project.
1.4.9. Web 링크 복사링크가 클립보드에 복사되었습니다!
1.4.9.1. HTTP compression now includes application/json and application/xhtml+xml by default 링크 복사링크가 클립보드에 복사되었습니다!
If HTTP compression is enabled, the quarkus.http.compress-media-types configuration property defines the list of media types to compress. In Red Hat build of Quarkus 3.20, the default value of this property has changed. Newly compressed media types now include application/json and application/xhtml+xml.
1.4.9.2. REST Client: Stricter configuration to optimize lookups 링크 복사링크가 클립보드에 복사되었습니다!
In Red Hat build of Quarkus 3.20, the REST Client Configuration became more strict to reduce the number of lookups and combinations required to retrieve the configuration:
-
The MicroProfile Rest Client config style
[Simple Class Name]/mp-restdoes not work anymore. The specification does not specify this style. TheFQCN/mp-reststyle continues to function as expected and as specified by the MicroProfile Rest Client. -
Only REST Clients discovered by Red Hat build of Quarkus are loaded by the
RestClientsConfigandRestClientsBuildTimeConfig. -
The
RestClientsConfig#clientsandRestClientsBuildTimeConfig#clientmaps always use the Fully Qualified Collection Name (FQCN) of the REST Client interface. Before, it would use all the keys found, even if related to the same REST Client duplicating entries. -
Removed legacy configuration names
quarkus.rest.client.max-redirectsandquarkus.rest.client.multipart-post-encoder-mode.
1.4.9.3. Qute: Default character escaping in JSON templates 링크 복사링크가 클립보드에 복사되었습니다!
Starting in Red Hat build of Quarkus 3.20, the quarkus-qute extension automatically escapes double quotes ("), backslashes (\), and control characters (U+0000 through U+001F) in JSON templates if a corresponding template variant is set. The extension automatically assigns a variant to templates located in the src/main/resources/templates directory.
By default, java.net.URLConnection#getFileNameMap() determines the content type of a template file. You can define additional suffix-to-content-type mappings by using the quarkus.qute.content-types configuration.
To render the unescaped value, use the raw or safe properties, which are implemented as extension methods of java.lang.Object, or wrap the string value in the io.quarkus.qute.RawString class.
For more information, see the Character escapes section of the Quarkus "Qute reference" guide.
In Red Hat build of Quarkus 3.20, with the quarkus-rest-jackson extension, only ObjectMapperCustomizer beans without qualifiers are applied to the default ObjectMapper instance of the Jackson JSON processor.
In earlier versions, all customizer beans, including those with custom qualifiers, were applied to the default ObjectMapper instance.
This change requires manual intervention. It is not included in the automated update process described in the Migrating applications to Red Hat build of Quarkus 3.20 guide.
For more information, see the following resources:
- The Improved Jackson JSON processing with reflection-free deserialization section of the Release Notes for Red Hat build of Quarkus 3.20.
- The Configuring JSON support section of the Quarkus "Writing JSON REST Services" guide.
1.4.9.5. REST: Empty query parameters now handled as null or empty collection 링크 복사링크가 클립보드에 복사되었습니다!
In earlier releases, with the quarkus-rest extension, query parameters with empty values, such as ?foo=, were deserialized as follows:
-
@RestQuery String fooproduced an empty string (""). -
@RestQuery List<String> fooproduced a collection containing a single empty string.
In Red Hat build of Quarkus 3.20, this behavior has changed:
-
@RestQuery String foois now deserialized asnull. -
@RestQuery List<String> foois now deserialized as an empty collection.
Update your code accordingly.
This change requires manual intervention. It is not included in the automated update process described in the Migrating applications to Red Hat build of Quarkus 3.20 guide.
1.4.9.6. WebSockets and WebSockets Client extensions deprecated 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat build of Quarkus 3.20 deprecates the quarkus-websockets and quarkus-websockets-client extensions, which implement the Jakarta WebSocket specification.
Red Hat build of Quarkus plans to stop supporting these extensions in a future release.
To ensure compatibility with upcoming versions, migrate to the Quarkus WebSockets Next extension,quarkus-websockets-next, which offers a modern, more efficient WebSocket API.
For more information, see the following Quarkus resources:
- Getting started with WebSockets Next
- WebSockets Next reference guide
- Quarkus WebSockets Next extension section of the "Release Notes for Red Hat build of Quarkus 3.20" guide
This change requires manual intervention. It is not included in the automated update process described in the Migrating applications to Red Hat build of Quarkus 3.20 guide.