YAML configuration
You can use a YAML file,application.yaml
, to configure your Quarkus application instead of the standard Java properties file, application.properties
.
YAML is widely used for defining resource descriptors, especially in Kubernetes.
Enable YAML configuration
To enable YAML configuration, add the quarkus-config-yaml
extension:
quarkus extension add quarkus-config-yaml
./mvnw quarkus:add-extension -Dextensions='quarkus-config-yaml'
./gradlew addExtension --extensions='quarkus-config-yaml'
Alternatively, add the following dependency to your project:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-config-yaml</artifactId>
</dependency>
implementation("io.quarkus:quarkus-config-yaml")
After adding the extension or dependency, to avoid confusion, remove the src/main/resources/application.properties
file and create a src/main/resources/application.yaml
file.
If both files are present, Quarkus gives precedence to properties in the YAML file. |
Quarkus recognizes both .yml and .yaml file extensions.
|
Example YAML configurations
The following snippets give examples of YAML configurations:
# YAML supports comments
quarkus:
datasource:
db-kind: postgresql
jdbc:
url: jdbc:postgresql://localhost:5432/some-database
# REST Client configuration property
quarkus:
rest-client:
org.acme.rest.client.ExtensionsService:
url: https://stage.code.quarkus.io/api
# For configuration property names that use quotes, do not split the string inside the quotes
quarkus:
log:
category:
"io.quarkus.category":
level: INFO
quarkus:
datasource:
jdbc:
url: jdbc:postgresql://localhost:5432/quarkus_test
hibernate-orm:
database:
generation: drop-and-create
oidc:
enabled: true
auth-server-url: http://localhost:8180/auth/realms/quarkus
client-id: app
app:
frontend:
oidc-realm: quarkus
oidc-app: app
oidc-server: http://localhost:8180/auth
# With profiles
"%test":
quarkus:
oidc:
enabled: false
security:
users:
file:
enabled: true
realm-name: quarkus
plain-text: true
Profiles
As you can see in the previous snippet, you can use profiles in YAML.
In YAML, keys that begin with %
are not allowed.
However, profile keys must start with this symbol.
To resolve this, enclose the profile keys in double quotes, as demonstrated by the example, "%test"
.
All configurations under the "%test"
key activate only when the test
profile is enabled.
For instance, the previous snippet shows that OpenID Connect (OIDC) (quarkus.oidc.enabled: false
) is disabled when the test
profile is active.
Without the test
profile, OIDC is enabled by default.
You can also define custom profiles, such as %staging
in the following example:
quarkus:
http:
port: 8081
"%staging":
quarkus:
http:
port: 8082
If you enable the staging
profile, the HTTP port is set to 8082
instead of 8081
.
The YAML configuration also supports profile-aware files.
In this case, properties for a specific profile can reside in an application-{profile}.yaml
named file.
The previous example can be expressed as:
quarkus:
http:
port: 8081
quarkus:
http:
port: 8082
Expressions
The YAML format also supports property expressions, by using the same format as Java properties:
mach: 3
x:
factor: 2.23694
display:
mach: ${mach}
unit:
name: "mph"
factor: ${x.factor}
You can reference nested properties by using the .
(dot) separator, as in ${x.factor}
.
External application.yaml file
The application.yaml
file can also be placed in config/application.yaml
to specialize the runtime configuration.
The file must be present in the root of the working directory relative to the Quarkus application runner:
.
├── config
│ └── application.yaml
├── my-app-runner
The values from this file override any values from the regular application.yaml
file if it exists.
Configuration property conflicts
The MicroProfile Config specification defines configuration properties as an arbitrary .
-delimited string.
However, structured formats such as YAML only support a subset of the possible configuration namespace.
For example, consider the two configuration properties quarkus.http.cors
and quarkus.http.cors.methods
.
One property is the prefix of another, so it might not be immediately evident how to specify both keys in your YAML configuration.
This is solved by using ~
as a null
key to represent any YAML property that is a prefix of another one:
quarkus:
http:
cors:
~: true
methods: GET,PUT,POST
YAML null
keys are not included in the assembly of the configuration property name, allowing them to be used at any level for disambiguating configuration properties.
Although Quarkus primarily uses .properties
file extension for configuration, the snakeyaml library, which is used for parsing YAML in Quarkus, can also parse JSON structures. This means you can use YAML files with JSON content inside.
YAML and JSON structures can be read in an application.yaml file.
Certainly, here’s a step-by-step guide on how to use complex configuration structures with Quarkus:
-
Define Your Configuration Interface.
@ConfigMapping(prefix = "server")
public interface ServiceConfig {
List<Environment> environments();
interface Environment {
String name();
String services();
}
}
-
Create the appropriate JSON structure and store it in a YAML file.
{
"server": {
"environments": [
{
"name": "dev",
"services": "bookstore"
},
{
"name": "batch",
"services": "warehouse"
}
]
}
}