编辑此页面

配置参考指南

本指南的内容已经修订并拆分为其他主题。请查看附加信息部分。

在本参考指南中,我们将介绍 Quarkus 配置的各个方面。Quarkus 应用程序和 Quarkus 本身(核心和扩展)都通过相同的机制进行配置,该机制利用 SmallRye Config API,它是 MicroProfile Config 规范的实现。

如果您正在寻找有关如何使 Quarkus 扩展可配置的信息,请参阅编写您自己的扩展指南。

1. 配置源

默认情况下,Quarkus 从多个来源读取配置属性(按降序排列)

  1. (400) 系统属性

  2. (300) 环境变量

  3. (295) 当前工作目录中的 .env 文件

  4. (260) $PWD/config/application.properties 中的 Quarkus 应用程序配置文件

  5. (250) 类路径中的 Quarkus 应用程序配置文件 application.properties

  6. (100) 类路径中的 MicroProfile Config 配置文件 META-INF/microprofile-config.properties

最终配置是所有这些来源定义的属性的聚合。配置属性查找从可用的最高序数配置源开始,并向下遍历到其他来源,直到找到匹配项。这意味着任何配置属性都可以通过在更高序数的配置源中设置不同的值来覆盖一个值。例如,使用环境变量配置的属性会覆盖使用 application.properties 文件提供的值。

config sources

1.1. 系统属性

系统属性可以通过启动期间的 -D 标志传递给应用程序。以下示例将值 youshallnotpass 分配给属性 quarkus.datasource.password

  • 对于 Quarkus 开发模式:./mvnw quarkus:dev -Dquarkus.datasource.password=youshallnotpass

  • 对于 runner jar:java -Dquarkus.datasource.password=youshallnotpass -jar target/quarkus-app/quarkus-run.jar

  • 对于本机可执行文件:./target/myapp-runner -Dquarkus.datasource.password=youshallnotpass

1.2. 环境变量

  • 对于 runner jar:export QUARKUS_DATASOURCE_PASSWORD=youshallnotpass ; java -jar target/quarkus-app/quarkus-run.jar

  • 对于本机可执行文件:export QUARKUS_DATASOURCE_PASSWORD=youshallnotpass ; ./target/myapp-runner

环境变量名称遵循 MicroProfile Config 指定的转换规则。Config 会为一个给定的属性名(例如 foo.BAR.baz)搜索三个环境变量

  • foo.BAR.baz - 完全匹配

  • foo_BAR_baz - 将每个既不是字母数字也不是 _ 的字符替换为 _

  • FOO_BAR_BAZ - 将每个既不是字母数字也不是 _ 的字符替换为 _;然后将名称转换为大写

SmallRye Config 指定了其他转换规则

  • 带双引号的属性 foo."bar".baz,将每个既不是字母数字也不是 _ 的字符替换为 _FOO__BAR__BAZ

  • 带短划线的属性 foo.bar-baz,将每个既不是字母数字也不是 _ 的字符替换为 _FOO_BAR_BAZ

  • 索引属性 foo.bar[0]foo.bar[0].baz,将每个既不是字母数字也不是 _ 的字符替换为 _FOO_BAR_0_FOO_BAR_0__BAZ

在某些情况下,查找确切的属性名称是不可能的。对于包含用户定义的路径段的配置名称就是这种情况。

应用环境变量名称的转换规则后,quarkus.datasource."datasource-name".jdbc.url 变为 QUARKUS_DATASOURCE__DATASOURCE_NAME__JDBC_URL。如果 Config 系统中都提供了这两个属性,则配置将按预期工作。

如果只有 QUARKUS_DATASOURCE__DATASOURCE_NAME__JDBC_URL 存在,则 Config 系统需要将配置名称重新转换为其最可能的点分隔格式。这对于固定的配置段来说效果很好,但对于包含动态段的名称则不然。在这种情况下,Quarkus 无法确定 DATASOURCE_NAME 应该转换为 datasource.name 还是 datasource-name(或任何其他特殊字符分隔符)。

因此,此类属性始终需要在另一个来源中使用其点分隔版本名称,以消除环境变量名称的歧义。它将提供额外的信息来执行双向转换并将属性名称匹配在一起。

# value can be left empty but must be supplied by another source at runtime (or be an optional)
quarkus.datasource."datasource-name".jdbc.url=
EXPORT QUARKUS_DATASOURCE__DATASOURCE_NAME__JDBC_URL=jdbc:postgresql://:5432/database

1.3. 当前工作目录中的 .env 文件

.env
QUARKUS_DATASOURCE_PASSWORD=youshallnotpass (1)
1 名称 QUARKUS_DATASOURCE_PASSWORD 遵循与 环境变量 相同的转换规则。

对于 dev 模式,此文件可以放置在项目的根目录中,但建议不要将其签入版本控制,因为它通常包含密码、访问令牌、API 密钥或其他机密信息。

.env 文件中的环境变量无法通过 System.getenv(String) API 访问。

1.4. Quarkus 应用程序配置文件

Quarkus 应用程序配置文件从类路径资源加载,例如 src/main/resources/application.propertiessrc/test/resources/application.properties 或包含 application.properties 条目的 jar 依赖项。找到的每个 application.properties 都被视为单独的 ConfigSource,并遵循与其他来源相同的规则(按属性覆盖)。此外,配置文件也可以位于 $PWD/config/application.properties 中。加载从 config 文件夹开始,然后按类路径顺序加载(应用程序源中的 application.properties 文件将在类加载顺序中具有优先级)。

application.properties
greeting.message=hello (1)
quarkus.http.port=9090 (2)
1 这是一个用户定义的配置属性。
2 这是一个由 quarkus-vertx-http 扩展使用的配置属性。
config/application.properties 也可以在 dev 模式中使用。该文件需要放置在构建工具输出目录(Maven 的 target 和 Gradle 的 build/classes/java/main)中。但是请记住,构建工具中的任何清理操作(如 mvn cleangradle clean)也会删除 config 目录。

1.5. MicroProfile Config 配置文件

src/main/resources/META-INF/microprofile-config.properties 中的 MicroProfile Config 配置文件。

microprofile-config.properties
greeting.message=hello (1)
quarkus.http.port=9090 (2)
1 这是一个用户定义的配置属性。
2 这是一个由 quarkus-vertx-http 扩展使用的配置属性。
它的工作方式与 Quarkus 应用程序配置文件 application.properties 完全相同。建议使用 Quarkus application.properties

1.6. 位置

除了默认的配置位置之外,Quarkus 还提供了一种扫描其他位置以查找配置属性文件的方法。

quarkus.config.locations 配置属性接受多个以逗号 , 分隔的位置,每个位置都必须表示有效的 URI。支持的 URI 方案有

  • 文件或目录 (file:)

  • 类路径资源

  • jar 资源 (jar:)

  • http 资源 (http:)

所有加载的源都使用找到 quarkus.config.locations 配置属性的源的相同序数。例如,如果 quarkus.config.locations 设置为系统属性,则所有加载的源的序数都设置为 400(系统属性使用 400 作为其序数)。可以通过设置 config_ordinal 属性和序数值来直接覆盖每个配置源的序数。config_ordinal 属性仅影响其所在源的序数。源首先按序数排序,然后按位置顺序排序,最后按加载顺序排序。

1.7. 其他配置源

Quarkus 提供了其他扩展,涵盖了其他配置格式和存储

也可以创建一个自定义配置源

2. 注入

Quarkus 使用 MicroProfile Config 注解在应用程序中注入配置属性。

@ConfigProperty(name = "greeting.message") (1)
String message;
1 您可以使用 @Inject @ConfigProperty 或仅使用 @ConfigProperty。对于使用 @ConfigProperty 注解的成员,@Inject 注解不是必需的。
如果应用程序尝试注入未设置的配置属性,则会抛出错误。
@ConfigProperty(name = "greeting.message") (1)
String message;

@ConfigProperty(name = "greeting.suffix", defaultValue="!") (2)
String suffix;

@ConfigProperty(name = "greeting.name")
Optional<String> name; (3)
1 如果您不为此属性提供值,则应用程序启动将失败,并显示 jakarta.enterprise.inject.spi.DeploymentException: No config value of type [class java.lang.String] exists for: greeting.message
2 如果配置未提供 greeting.suffix 的值,则注入默认值。
3 此属性是可选的 - 如果配置未提供 greeting.name 的值,则注入一个空的 Optional
使用 配置映射来对相似的配置属性进行分组。

2.1. 默认值

如果属性与默认值相关联(通过 defaultValue 属性),并且没有为该属性提供配置值,那么将使用默认值,而不是抛出 jakarta.enterprise.inject.spi.DeploymentExceptiondefaultValue 值表示为 String,并使用与处理配置值相同的转换机制。已经存在几个内置的转换器,用于原始类型、装箱原始类型和其他类;例如

  • 原始类型:booleanbyteshort 等。

  • 装箱原始类型:java.lang.Booleanjava.lang.Bytejava.lang.Short 等。

  • 可选容器:java.util.Optionaljava.util.OptionalIntjava.util.OptionalLongjava.util.OptionalDouble

  • Java enum 类型

  • JSR 310 java.time.Duration

  • JDK 网络 java.net.SocketAddressjava.net.InetAddress 等。

正如您可能期望的那样,这些转换器是 org.eclipse.microprofile.config.spi.Converter 实现。因此,这些转换器符合 Microprofile 或自定义实现提供商的表达式规则,例如

  • 布尔值在 "true"、"1"、"YES"、"Y" "ON" 的情况下将为 true。否则,该值将被解释为 false

  • 对于浮点值和双精度值,小数位必须用点 . 分隔

请注意,当 Optional* 类型和 defaultValue 属性组合使用时,仍然会使用定义的 defaultValue,并且如果没有为该属性提供值,则 Optional* 将存在并填充转换后的默认值。但是,当属性显式为空时,不会使用默认值,并且 Optional 将为空。考虑以下示例

# missing value, optional property
greeting.name=

在这种情况下,由于 greeting.name 被配置为上面的 Optional*,因此相应的属性值将为空的 Optional,并且执行将正常继续。即使配置了默认值,也会出现这种情况:如果属性在配置中被显式清除,则使用默认值。

另一方面,这个例子

# missing value, non-optional
greeting.suffix=

将导致启动时出现 java.util.NoSuchElementException: SRCFG02004: Required property greeting.message not found,并且不会分配默认值。

下面是 Quarkus 提供的转换器的示例

@ConfigProperty(name = "server.address", defaultValue = "192.168.1.1")
InetAddress serverAddress;

3. 以编程方式访问

org.eclipse.microprofile.config.ConfigProvider.getConfig() API 允许以编程方式访问 Config API。此 API 在 CDI 注入不可用的情况下最有用。

String databaseName = ConfigProvider.getConfig().getValue("database.name", String.class);
Optional<String> maybeDatabaseName = ConfigProvider.getConfig().getOptionalValue("database.name", String.class);
不要使用 System.getProperty(String)System.getEnv(String) 来检索配置值。这些 API 没有配置意识,并且不支持本指南中描述的功能。

4. 配置文件

我们经常需要根据目标环境以不同的方式配置我们的应用程序。例如,本地开发环境可能与生产环境不同。

配置配置文件允许在同一文件或单独的文件中进行多个配置,并通过配置文件名称在它们之间进行选择。

4.1. 属性名称中的配置文件

为了能够设置具有相同名称的属性,每个属性都需要以百分号 % 开头,后跟配置文件名称和一个点 .,语法为 %{profile-name}.config.name

application.properties
quarkus.http.port=9090
%dev.quarkus.http.port=8181

Quarkus HTTP 端口将为 9090。如果 dev 配置文件处于活动状态,则它将为 8181。

.env 文件中的配置文件遵循语法 _{PROFILE}_CONFIG_KEY=value

.env
QUARKUS_HTTP_PORT=9090
_DEV_QUARKUS_HTTP_PORT=8181

如果配置文件没有为特定属性定义值,则使用默认(无配置文件)值

application.properties
bar=”hello”
baz=”bonjour”
%dev.bar=”hallo”

启用 dev 配置文件后,属性 bar 的值为 hallo,但属性 baz 的值为 bonjour。如果启用 prod 配置文件,则 bar 的值为 hello(因为没有 prod 配置文件的特定值),而 baz 的值为 bonjour

4.2. 默认配置文件

默认情况下,Quarkus 提供三个配置文件,这些配置文件在特定条件下自动激活

  • dev - 在开发模式下(即 quarkus:dev)激活

  • test - 在运行测试时激活

  • prod - 不在开发或测试模式下运行时使用的默认配置文件

4.3. 自定义配置文件

也可以创建其他配置文件,并使用 quarkus.profile 配置属性激活它们。带有新配置文件名称的单个配置属性是唯一的要求

application.properties
quarkus.http.port=9090
%staging.quarkus.http.port=9999

quarkus.profile 设置为 staging 将激活 staging 配置文件。

io.smallrye.config.SmallRyeConfig#getProfiles API 提供了一种以编程方式检索活动配置文件的方法。

4.4. 配置文件感知文件

在这种情况下,特定配置文件的属性可能位于名为 application-{profile}.properties 的文件中。前面的例子可以表示为

application.properties
quarkus.http.port=9090
%staging.quarkus.http.test-port=9091
application-staging.properties
quarkus.http.port=9190
quarkus.http.test-port=9191

在这种风格中,配置文件感知文件中的配置名称不需要以配置文件名称为前缀。

配置文件感知文件中的属性优先于主文件中定义的配置文件感知属性。

不要使用配置文件感知文件来设置 quarkus.profilequarkus.test.profile。这将不起作用,因为需要提前配置配置文件才能加载配置文件感知文件。

必须存在一个 application.properties 文件(即使是空的),位于配置文件感知文件 (application-{profile}.properties) 的确切位置,以便包含在配置中,以确保加载文件时的顺序一致。

4.5. 父配置文件

父配置文件为当前配置文件添加一个级别的层次结构。配置 quarkus.config.profile.parent 接受单个配置文件名称。

当父配置文件处于活动状态时,如果在当前活动配置文件中找不到属性,则配置查找将回退到父配置文件。考虑

quarkus.profile=dev
quarkus.config.profile.parent=common

%common.quarkus.http.port=9090
%dev.quarkus.http.ssl-port=9443

quarkus.http.port=8080
quarkus.http.ssl-port=8443

然后

  • 活动配置文件是 dev

  • 父配置文件是 common

  • quarkus.http.port 为 9090

  • quarkus.http.ssl-port 为 9443

不要使用配置文件感知文件来设置 quarkus.config.profile.parent。这将不起作用,因为需要提前配置配置文件才能加载配置文件感知文件。

4.6. 多个配置文件

可以同时激活多个配置文件。配置 quarkus.profile 接受以逗号分隔的配置文件名称列表:quarkus.profile=common,devcommondev 都是单独的配置文件。

当多个配置文件处于活动状态时,配置文件配置的规则是相同的。如果两个配置文件定义了相同的配置,那么最后一个列出的配置文件具有优先级。考虑

application.properties
quarkus.profile=common,dev

my.prop=1234
%common.my.prop=1234
%dev.my.prop=5678

%common.commom.prop=common
%dev.dev.prop=dev
%test.test.prop=test

然后

  • common.prop 值为 common

  • dev.prop 值为 dev

  • my.prop 值为 5678

  • test.prop 没有 value

也可以定义多个配置文件属性,配置文件名称以逗号分隔。如果在多个配置文件属性中存在相同的属性名称,则具有最具体配置文件的属性获胜

application.properties
quarkus.profile=dev

%prod,dev.my.prop=1234
%dev.my.prop=5678

%prod,dev.another.prop=1234

然后

  • my.prop 值为 5678。

  • another.prop 值为 1234。

多个配置文件的优先级按相反的顺序工作。使用 quarkus.profile=common,dev,Quarkus 首先检查 dev 配置文件,然后检查 common 配置文件。

4.7. 默认运行时配置文件

默认的 Quarkus 运行时配置文件设置为用于构建应用程序的配置文件

./mvnw package -Dnative -Dquarkus.profile=prod-aws
./target/my-app-1.0-runner (1)
1 该命令将使用 prod-aws 配置文件运行。可以使用 quarkus.profile 配置覆盖此设置。

5. 属性表达式

Quarkus 在配置值上提供属性表达式扩展。表达式字符串是纯字符串和表达式段的混合,表达式段由序列 ${ …​ } 包裹。

这些表达式在读取属性时解析。因此,如果配置属性是构建时属性,则属性表达式将在构建时解析。如果配置属性可以在运行时覆盖,则将在运行时解析。

考虑

application.properties
remote.host=quarkus.io
callable.url=https://${remote.host}/

callable.url 属性的解析值为 https://quarkus.net.cn/

另一个例子是按配置文件定义不同的数据库服务器

application.properties
%dev.quarkus.datasource.jdbc.url=jdbc:mysql://:3306/mydatabase?useSSL=false
quarkus.datasource.jdbc.url=jdbc:mysql://remotehost:3306/mydatabase?useSSL=false

可以简化为

application.properties
%dev.application.server=localhost
application.server=remotehost

quarkus.datasource.jdbc.url=jdbc:mysql://${application.server}:3306/mydatabase?useSSL=false

此外,表达式扩展引擎支持以下段

  • ${expression:value} - 如果扩展找不到值,则在 : 之后提供默认值。

  • ${my.prop${compose}} - 组合表达式。首先解析内部表达式。

  • ${my.prop}${my.prop} - 多个表达式。

如果表达式无法扩展且未提供默认值,则会抛出 NoSuchElementException

表达式查找在所有配置源中执行。表达式值和扩展值可能位于不同的配置源中。

5.1. 使用环境变量

属性表达式也可以与环境变量一起使用。

application.properties
remote.host=quarkus.io
application.host=${HOST:${remote.host}}

这将扩展 HOST 环境变量,并在未设置 HOST 时使用属性 remote.host 的值作为默认值。

6. 密钥表达式

密钥配置可以表示为 ${handler::value},其中 handlerio.smallrye.config.SecretKeysHandler 的名称,用于解码或解密 value。考虑

application.properties
my.secret=${aes-gcm-nopadding::DJNrZ6LfpupFv6QbXyXhvzD8eVDnDa_kTliQBpuzTobDZxlg}

# the encryption key required to decode the secret. It can be set in any source.
smallrye.config.secret-handler.aes-gcm-nopadding.encryption-key=somearbitrarycrazystringthatdoesnotmatter

查找 my.secret 将使用 SecretKeysHandler 名称 aes-gcm-nopadding 来解码值 DJNrZ6LfpupFv6QbXyXhvzD8eVDnDa_kTliQBpuzTobDZxlg

有关更多信息,请查看 SmallRye Config 密钥文档。

SmallRye Config 可能会提供 Quarkus 不完全支持的处理程序。目前,仅支持 smallrye-config-crypto

7. 访问生成的 UUID

Quarkus 的默认配置源提供了一个随机 UUID 值。它在启动时生成 UUID。因此,该值在启动之间会发生变化,包括开发模式下的重新加载。

您可以使用 quarkus.uuid 属性访问生成的值。使用表达式来访问它:${quarkus.uuid}。例如,它对于配置具有唯一消费者组的 Kafka 客户端很有用

mp.messaging.incoming.prices.group.id=${quarkus.uuid}

8. 清除属性

可选的运行时属性,以及在构建时设置了值或具有默认值的属性,可以通过将空字符串分配给该属性来显式清除。请注意,这只会影响运行时属性,并且只会适用于值不是必需的属性。

application.properties
remote.host=quarkus.io

使用 -Dremote.host= 查找 remote.host 将抛出一个异常,因为系统属性清除了该值。

9. 索引属性

包含未转义逗号的配置值可以转换为 Collection。这对于简单的情况有效,但对于更高级的情况来说,它变得繁琐且受到限制。

索引属性提供了一种在配置属性名称中使用索引来映射 Collection 类型中的特定元素的方法。由于索引元素是属性名称的一部分,而不是包含在值中,因此也可以使用它来将复杂对象类型映射为 Collection 元素。考虑

application.properties
my.collection=dog,cat,turtle

my.indexed.collection[0]=dog
my.indexed.collection[1]=cat
my.indexed.collection[2]=turtle

索引属性语法使用属性名称和方括号 [ ],中间有一个索引。

调用 Config#getValues("my.collection", String.class) 将自动创建并转换一个 List<String>,其中包含值 dogcatturtle。调用 Config#getValues("my.indexed.collection", String.class) 返回完全相同的结果。如果在两种形式(常规和索引)中存在相同的属性名称,则常规值具有优先级。

索引属性按其索引排序,然后添加到目标 Collection。索引中包含的任何间隙都不会解析为目标 Collection,这意味着 Collection 结果将存储所有值,而没有任何间隙。

10. 配置 Quarkus

Quarkus 本身通过与您的应用程序相同的机制进行配置。Quarkus 为其自己的配置保留 quarkus. 命名空间。例如,要配置 HTTP 服务器端口,您可以在 application.properties 中设置 quarkus.http.port。所有 Quarkus 配置属性都已记录并可搜索

如上所述,以 quarkus. 为前缀的属性实际上是为配置 Quarkus 本身及其扩展而保留的。因此,quarkus. 前缀绝不应用于特定于应用程序的属性。

10.1. 构建时配置

某些 Quarkus 配置仅在构建时生效,这意味着在运行时无法更改它们。这些配置在运行时仍然可用,但作为只读配置,并且对 Quarkus 行为没有影响。对任何这些配置的更改都需要重建应用程序本身才能反映此类属性的更改。

在构建时固定的属性在所有配置选项列表中使用锁定图标 () 标记。

但是,某些扩展确实定义了在运行时可覆盖的属性。一个简单的例子是数据库 URL、用户名和密码,这些信息仅在您的目标环境中具体知道,因此可以在运行时设置它们并影响应用程序行为。

11. 在发布应用程序后更改构建时属性

如果您处于需要更改应用程序构建后的构建时配置的罕见情况,那么请查看如何使用重新增强来重建不同构建时配置的增强输出。

12. 跟踪构建时使用的有效构建时配置

鉴于配置源通常提供比构建期间实际使用的更多选项,因此了解在 Quarkus 构建过程中实际使用了哪些配置选项可能很有用。

12.1. 转储构建期间读取的构建时配置选项

quarkus.config-tracking.enabled 设置为 true 将启用一个配置拦截器,该拦截器将记录在构建过程中读取的每个配置选项及其值。默认情况下,结果报告将存储在 ${project.basedir}/.quarkus/quarkus-prod-config-dump 中。可以使用以下选项配置目标文件

  • quarkus.config-tracking.directory - 应该存储配置转储的目录,默认为 ${project.basedir}/.quarkus

  • quarkus.config-tracking.file-prefix - 文件名前缀,默认值为 quarkus

  • quarkus.config-tracking.file-suffix - 文件名后缀,默认值为 -config-dump

  • quarkus.config-tracking.file - 应该存储配置转储的文件的路径。此选项取代 file-prefixfile-suffix 选项。除非该值为相对路径,否则也会取代 quarkus.config-tracking.directory 的值。

文件名 quarkus-prod-config-dumpprod 部分指的是 Quarkus 构建模式,表明转储是为生产构建进行的。

选择 ${project.basedir}/.quarkus 目录作为默认位置的原因是为了方便跟踪构建之间的构建时配置更改,并将其用作构建输出缓存工具(例如 Apache Maven 构建缓存Develocity 构建缓存)是否必须重建应用程序二进制文件的指标。

12.1.1. 过滤配置选项

可以通过使用以逗号分隔的应该过滤掉的配置选项名称列表配置 quarkus.config-tracking.exclude 来指示配置跟踪器从报告中排除某些选项。

12.1.2. 路径值

具有以用户主目录开头的绝对路径值的配置选项,默认情况下会使用 Unix 主目录别名 '~' 替换用户主目录部分,并使用 / 作为路径元素分隔符进行转换。

可以通过将 quarkus.config-tracking.use-user-home-alias-in-paths 设置为 false 来禁用此转换。

12.1.3. 哈希记录的配置值

可以在将配置值写入文件之前使用 SHA-512 算法对其进行哈希处理。应该对其值进行哈希处理的配置选项名称可以在 quarkus.config-tracking.hash-options 中配置为逗号分隔的列表。

12.2. 跟踪构建之间的构建时配置更改

虽然 quarkus.config-tracking.enabled 启用了有效的构建时配置报告生成,但还可以检查存储在该报告中的值在启动项目的下一次构建之前是否已更改。

Maven 项目可以将以下目标添加到它们的 quarkus-maven-plugin 配置中

      <plugin>
        <groupId>${quarkus.platform.group-id}</groupId>
        <artifactId>quarkus-maven-plugin</artifactId>
        <version>${quarkus.platform.version}</version>
        <extensions>true</extensions>
        <executions>
          <execution>
            <id>track-prod-config-changes</id>
            <phase>process-resources</phase>
            <goals>
              <goal>track-config-changes</goal>
            </goals>
          </execution>
          <!-- other executions would follow below -->

track-config-changes 目标查找 ${project.basedir}/.quarkus/quarkus-prod-config-dump(文件名和目录是可配置的),如果该文件已经存在,则检查存储在配置转储中的值是否已更改。它将记录已更改的选项,并将 ${project.basedir}/.quarkus/quarkus-prod-config-dump 中存在的每个选项的当前值保存在 ${project.basedir}/target/quarkus-prod-config.check 中(目标文件名和位置可以配置)。如果自上次构建以来构建时配置未更改,则 ${project.basedir}/.quarkus/quarkus-prod-config-dump${project.basedir}/.quarkus/quarkus-prod-config-dump 将相同。

12.2.1. 转储 Quarkus 应用程序依赖项

除了转储配置值之外,track-config-changes 目标还转储所有 Quarkus 应用程序依赖项,包括 Quarkus 构建时依赖项。该文件可用于检查自上次运行以来 Quarkus 构建类路径是否已更改,例如与 Develocity 的校验和类路径的能力一起使用。默认情况下,依赖项列表将存储在 target/quarkus-prod-dependencies.txt 文件下。可以使用插件参数配置不同的位置。

12.2.2. 当找不到记录的配置时转储当前构建配置

默认情况下,track-config-changes 查找先前构建期间记录的配置,如果未找到则不执行任何操作。启用 dumpCurrentWhenRecordedUnavailable 参数将使其转储当前构建配置选项,同时考虑 quarkus.config-tracking.* 配置。

与在 quarkus:build 目标期间记录的构建配置选项不同,通过启用 dumpCurrentWhenRecordedUnavailable 使用 quarkus:track-config-changes 保存的配置选项将包括 org.eclipse.microprofile.config.Config 实例公开的所有构建配置选项。这意味着此报告可能包括 Quarkus 应用程序构建过程不会使用的一些构建配置选项,但由于 MicroProfile Config 规范允许配置源不向用户公开它们提供的所有属性名称,因此也可能缺少一些构建配置选项。

13. 在静态初始化阶段注入的配置属性值

Quarkus 收集在 静态初始化阶段期间注入到 CDI bean 中的配置属性值。然后将收集的值与其运行时初始化对应值进行比较,如果检测到不匹配,则应用程序启动失败。这怎么可能发生?例如,假设有一个 CDI bean org.acme.MyBeanMyBean 注入一个名为 foo@ConfigProperty,并在本机构建期间初始化。配置属性在本机构建期间不存在,因此使用默认值 bar。但是稍后,当应用程序启动时,该属性是使用系统属性定义的:-Dfoo=baz。这将导致不一致的状态和意外的行为。因此,在这种情况下,Quarkus 默认会失败。

package org.acme;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.enterprise.context.Initialized;
import org.eclipse.microprofile.config.inject.ConfigProperty;

@ApplicationScoped
public class MyBean {

   @ConfigProperty(name = "foo", defaultValue = "bar") (1)
   String foo;

    void onInit(@Observes @Initialized(ApplicationScoped.class) Object event) { (2)
       // this observer method is notified during STATIC_INIT...
    }
}
1 当创建 bean 时会注入配置属性,并且该值是固定的。
2 在这种特定情况下,观察者 @Initialized(ApplicationScoped.class) 导致了 bean 的初始化。但是,还有其他可能性。例如,某些扩展在静态初始化阶段初始化组件。

您可以使用 @io.quarkus.runtime.annotations.StaticInitSafe 注释注入的字段/参数,以将注入的配置对象标记为可以在静态初始化阶段安全地初始化。

package org.acme;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.enterprise.context.Initialized;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import io.quarkus.runtime.annotations.StaticInitSafe;

@ApplicationScoped
public class MyBeanNoFailure {

   @StaticInitSafe (1)
   @ConfigProperty(name = "foo", defaultValue = "bar")
   String foo;

    void onInit(@Observes @Initialized(ApplicationScoped.class) Object event) {
       // this observer method is notified during STATIC_INIT...
    }
}
1 指示 Quarkus 如果检测到不匹配则不要失败。

15. 配置参考

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

将此设置为 true 以仅从系统属性和环境变量中读取配置。这仅适用于运行时。

环境变量:QUARKUS_CONFIG_SOURCES_SYSTEM_ONLY

显示更多

布尔值

false

Quarkus 启动时将处于活动状态的以逗号分隔的配置文件列表。

环境变量:QUARKUS_PROFILE

显示更多

字符串列表

接受单个配置文件名称。如果在当前活动配置文件中找不到配置属性,则配置会在通过此配置设置的配置文件中执行相同的查找。

环境变量:QUARKUS_CONFIG_PROFILE_PARENT

显示更多

字符串

要与 Config 一起加载的其他配置位置。该配置支持多个以逗号分隔的位置,每个位置都必须表示有效的 java.net.URI

环境变量: QUARKUS_CONFIG_LOCATIONS

显示更多

URI 列表

验证 @ConfigMapping 是否映射了映射前缀中包含的每个可用配置名称。

环境变量: QUARKUS_CONFIG_MAPPING_VALIDATE_UNKNOWN

显示更多

布尔值

启用在 DEBUG 日志级别记录配置值查找。
配置值的日志记录需要在 io.smallrye.config 类别中将类别设置为 DEBUGquarkus.log.category."io.smallrye.config".level=DEBUG

环境变量: QUARKUS_CONFIG_LOG_VALUES

显示更多

布尔值

如果应用程序以与编译时不同的构建时配置启动,应该发生什么。 这对于防止配置错误可能很有用。

如果设置为 warn,应用程序将在启动时发出警告。

如果设置为 fail,应用程序将在启动时失败。

利用 `@io.quarkus.test.junit.TestProfile` 的原生测试始终以 quarkus.config.build-time-mismatch-at-runtime = fail 运行。

环境变量: QUARKUS_CONFIG_BUILD_TIME_MISMATCH_AT_RUNTIME

显示更多

warn, fail

warn

相关内容