使用属性文件配置红帽构建的 Quarkus 应用程序
向红帽构建的 Quarkus 文档提供反馈
要报告错误或改进文档,请登录您的红帽 JIRA 帐户并提交问题。如果您没有红帽 JIRA 帐户,系统会提示您创建一个帐户。
流程
- 单击以下链接 来创建 ticket。
- 在 Summary 中输入有关此问题的简单描述。
- 提供有关 描述 中问题或增强功能的详细描述。包括一个 URL,以在文档中发生问题。
- 点 Submit 创建问题并将其路由到适当的文档团队。
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中有问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
第 1 章 使用属性文件配置红帽构建的 Quarkus 应用程序
作为应用程序开发人员,您可以使用红帽构建的 Quarkus 来创建在 OpenShift 和无服务器环境中运行的 Java 编写的基于微服务的应用程序。编译到原生可执行文件的应用程序占用较小的内存占用和快速启动时间。
您可以使用以下方法之一配置 Quarkus 应用程序:
-
在
application.properties
文件中设置属性 -
通过更新
application.yaml
文件以 YAML 格式应用结构化配置
您还可以通过执行以下操作为应用程序扩展和自定义配置:
- 使用属性表达式替换和制作配置属性值
- 使用自定义配置源转换器实施符合 MicroProfile 规范的类,从不同的外部来源读取配置值
- 使用配置配置集为开发、测试和生产环境保留一组配置值
该流程包括使用 Quarkus config-quickstart
练习创建的配置示例。
先决条件
已安装 OpenJDK 17 或 21,并设置
JAVA_HOME
环境变量来指定 Java SDK 的位置。- 要下载 Red Hat build of OpenJDK,请登录红帽客户门户网站并进入 Software Downloads。
已安装 Apache Maven 3.8.6 或更高版本。
您已将 Maven 配置为使用 Quarkus Maven 存储库中的 工件。
- 要了解如何配置 Maven 设置,请参阅开始使用 Quarkus。
1.1. 配置选项
您可以在单个配置文件中管理应用程序的设置。另外,您可以定义配置文件来对不同环境相关的设置进行分组,如开发、测试或生产。这样,您可以在配置集间轻松切换并应用特定于环境的属性,而无需更改主配置文件。
默认情况下,Quarkus 从 src/main/resources
目录中的 application.properties
文件中读取属性。如果希望在 application.yaml
文件中配置和管理应用程序属性,请将 quarkus-config-yaml
依赖项添加到项目的 pom.xml
文件中。如需更多信息,请参阅 添加 YAML 配置支持。
红帽构建的 Quarkus 还支持 MicroProfile 配置,可用于从各种来源加载应用的配置。通过使用 Eclipse MicroProfile 项目中的 MicroProfile 配置规范,您可以将配置属性注入到应用中,并使用您的代码中定义的方法访问它们。
Quarkus 可以从不同的来源读取应用程序属性,包括:
- 文件系统
- 数据库
-
Kubernetes 或 OpenShift Container Platform
ConfigMap
或Secret
对象 - Java 应用程序都可以加载的任何源
1.2. 创建配置快速启动项目
使用 config-quickstart
项目,您可以使用 Apache Maven 和 Quarkus Maven 插件启动并运行简单的 Quarkus 应用程序。以下流程描述了如何创建 Quarkus Maven 项目。
先决条件
已安装 OpenJDK 17 或 21,并设置
JAVA_HOME
环境变量来指定 Java SDK 的位置。- 要下载红帽 OpenJDK 的构建,请登录红帽客户门户网站并转至 软件下载。
已安装 Apache Maven 3.8.6 或更高版本。
流程
验证 Maven 使用 OpenJDK 17 或 21,且 Maven 版本是否为 3.8.6 或更高版本:
mvn --version
如果
mvn
命令没有返回 OpenJDK 17 或 21,请确保系统上安装 OpenJDK 17 或 21 的目录包含在PATH
环境变量中:export PATH=$PATH:<path_to_JDK>
输入以下命令生成项目:
mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.15.3.SP1-redhat-00002:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=config-quickstart \ -DplatformGroupId=com.redhat.quarkus.platform \ -DplatformVersion=3.15.3.SP1-redhat-00002 \ -DclassName="org.acme.config.GreetingResource" \ -Dpath="/greeting" cd config-quickstart
验证
前面的 mvn
命令在 config-quickstart
目录中创建以下项目:
- Maven 项目目录结构
-
org.acme.config.GreetingResource
资源 -
启动应用程序后可从
http://localhost:8080
访问的登录页面 - 相关的单元测试,用于在原生模式和 JVM 模式中测试您的应用程序
-
src/main/docker
子目录中的Dockerfile.jvm
和Dockerfile.native
文件示例 - 应用程序配置文件
或者,您可以下载 Quarkus Maven 项目,以便从 Quarkus Quickstarts 归档或克隆 Quarkus Quickstarts Git 存储库。Quarkus config-quickstart
exercise 位于 config-quickstart
目录中。
1.3. 将配置值注入您的红帽构建的 Quarkus 应用程序
红帽构建的 Quarkus 使用 MicroProfile 功能的配置将配置数据注入应用。您可以使用上下文和依赖项注入(CDI)或代码中定义方法来访问配置。
使用 @ConfigProperty
注释,将对象属性映射到应用的 MicroProfile Config Sources
文件中的键。
以下流程和示例演示了如何使用红帽构建 Quarkus Application 配置文件 application.properties
将单个属性配置注入 Quarkus config-quickstart
项目。
就像 application. properties 文件一样,您可以使用 MicroProfile
配置属性文件(src/main/resources/META-INF/microprofile-config.properties
)。
但是,使用 application.properties
是首选的方法。
先决条件
您已创建了 Quarkus config-quickstart
项目。
对于该项目的完整示例,请下载 Quarkus Quickstarts 存档或克隆 Quarkus Quickstarts Git 存储库,再进入 config-quickstart
目录。
流程
-
打开
src/main/resources/application.properties
文件。 在您的配置文件中添加配置属性,其中 <
;property_name&
gt; 是属性名称,<value
> 是属性值:<property_name>=<value>
以下示例演示了如何在 Quarkus
config-quickstart
项目中设置greeting.message
和greeting.name
属性的值:application.properties
文件示例greeting.message=hello greeting.name=quarkus
重要当您配置应用程序时,请不要使用字符串
quarkus
前缀应用程序特定属性。quarkus
前缀用于在框架级别配置 Quarkus。使用quarkus
作为特定应用程序属性的前缀可能会导致应用程序运行时出现意外的结果。查看项目中的
GreetingResource.java
Java 文件。该文件包含带有hello ()
方法的GreetingResource
类,它会在/greeting
端点上发送 HTTP 请求时返回一条消息:GreetingResource.java
文件示例package org.acme.config; import java.util.Optional; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.eclipse.microprofile.config.inject.ConfigProperty; @Path("/greeting") public class GreetingResource { String message; Optional<String> name; String suffix; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return message + " " + name.orElse("world") + suffix; } }
在提供的示例中,
hello ()
方法中
消息和名称
字符串的值不会被初始化。当端点被调用时,应用会抛出NullPointerException
,并成功在此状态启动。定义
消息
、name
和suffix
字段,并使用@ConfigProperty
为它们添加注解,这与您为greeting.message
和 greeting.name 属性定义
的值匹配。使用@ConfigProperty
注释来注入每个字符串的配置值。例如:GreetingResource.java
文件示例package org.acme.config; import java.util.Optional; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.eclipse.microprofile.config.inject.ConfigProperty; @Path("/greeting") public class GreetingResource { @ConfigProperty(name = "greeting.message") 1 String message; @ConfigProperty(name = "greeting.suffix", defaultValue="!") 2 String suffix; @ConfigProperty(name = "greeting.name") Optional<String> name; 3 @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return message + " " + name.orElse("world") + suffix; } }
- 1
- 如果您没有为
greeting.message
字符串配置值,应用程序会失败并抛出以下异常:jakarta.enterprise.inject.spi.DeploymentException: io.quarkus.runtime.configuration.ConfigurationException: Failed to load config value of type java.lang.String for: greeting.message
- 2
- 如果没有为
greeting.suffix
配置值,Quarkus 会将它解析为默认值。 - 3
- 如果没有定义
greeting.name
属性,则name
的值不可用。即使这个值不可用,应用程序仍然在运行,因为您在名称
上设置Optional
参数。
注意要注入配置的值,您可以使用
@ConfigProperty
。您不需要为使用@ConfigProperty
标注的成员包含@Inject
注释。
在开发模式下编译并启动应用程序:
./mvnw quarkus:dev
在新终端窗口中输入以下命令来验证端点返回消息:
curl http://localhost:8080/greeting
这个命令返回以下输出:
hello quarkus!
- 要停止应用程序,请按 Ctrl+C。
1.4. 更新功能测试以验证配置更改
在测试应用程序的功能前,您必须更新功能测试,以反映您对应用程序端点所做的更改。以下流程演示了如何在 Quarkus config-quickstart
项目中更新 testHelloEndpoint
方法。
步骤
-
打开
GreetingResourceTest.java
文件。 更新
testHelloEndpoint
方法的内容:package org.acme.config; import io.quarkus.test.junit.QuarkusTest; import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; import static org.hamcrest.CoreMatchers.is; @QuarkusTest public class GreetingResourceTest { @Test public void testHelloEndpoint() { given() .when().get("/greeting") .then() .statusCode(200) .body(is("hello quarkus!")); // Modified line } }
在开发模式下编译并启动应用程序:
./mvnw quarkus:dev
-
要开始运行测试,请在键盘上按
r
键。
1.5. 设置配置属性
默认情况下,Quarkus 从 src/main/resources
目录中的 application.properties
文件中读取属性。如果更改了构建属性,请确保重新打包应用程序。
Quarkus 在构建期间配置大多数属性。扩展可以在运行时将属性定义为可过量使用,例如数据库 URL、用户名和密码,并可特定于您的目标环境。
先决条件
-
您已创建了 Quarkus
config-quickstart
项目。 -
您已在项目的
application.properties
文件中定义greeting.message
和greeting.name
属性。
步骤
要打包 Quarkus 项目,请输入以下命令:
./mvnw clean package
使用以下方法之一设置配置属性:
设置系统属性:
输入以下命令,其中 <
;property_name
> 是您要添加的配置属性的名称,<value
> 是属性值:java -D<property_name>=<value> -jar target/quarkus-app/quarkus-run.jar
例如,要将
greeting.suffix
属性的值设置为?
,请输入以下命令:java -Dgreeting.suffix=? -jar target/quarkus-app/quarkus-run.jar
设置环境变量:
输入以下命令,其中 <
;property_name
> 是您要设置的配置属性的名称,<value
> 是 属性的值:export <property_name>=<value> ; java -jar target/quarkus-app/quarkus-run.jar
注意环境变量名称遵循 Eclipse MicroProfile 的转换规则。将名称转换为大写,并将不是字母数字的任何字符替换为下划线(
_
)。使用环境文件:
在当前工作目录中创建
.env
文件并添加配置属性,其中 <PROPERTY_NAME&
gt; 是属性名称,<value
> 是属性值:<PROPERTY_NAME>=<value>
注意在开发模式中,此文件位于项目的根目录中。不要跟踪版本控制中的文件。如果在项目的根目录中创建
.env
文件,您可以定义程序读取为属性的键和值。使用
application.properties
文件:将配置文件放在运行应用程序的
$PWD/config/application.properties
目录中,以便该文件中定义的任何运行时属性都覆盖默认配置。注意您还可以在开发模式中使用
config/application.properties
功能。将config/application.properties
文件放在目标
目录中。构建工具(如mvn clean
)的任何清理操作也会删除config
目录。
1.6. 高级配置映射
以下高级映射步骤是特定于红帽构建的 Quarkus 的扩展,位于 MicroProfile 配置规范之外。
1.6.1. 使用 @ConfigMapping 注解接口
使用 @io.smallrye.config.ConfigMapping
注释来分组配置属性,而不是单独注入多个相关的配置值。以下流程描述了如何使用 Quarkus config-quickstart
项目上的 @ConfigMapping
注释。
先决条件
-
您已创建了 Quarkus
config-quickstart
项目。 -
您已在项目的
application.properties
文件中定义greeting.message
和greeting.name
属性。
步骤
查看项目中的
GreetingResource.java
文件,并确保该文件包含下例中所示的内容。要使用@ConfigProperty
注释将另一个配置源的配置属性注入此类,您必须导入java.util.Optional
和org.eclipse.microprofile.config.inject.ConfigProperty
软件包。GreetingResource.java
文件示例package org.acme.config; import java.util.Optional; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.eclipse.microprofile.config.inject.ConfigProperty; @Path("/greeting") public class GreetingResource { @ConfigProperty(name = "greeting.message") String message; @ConfigProperty(name = "greeting.suffix", defaultValue="!") String suffix; @ConfigProperty(name = "greeting.name") Optional<String> name; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return message + " " + name.orElse("world") + suffix; } }
在
src/main/java/org/acme/config
目录中创建一个GreetingConfiguration.java
文件。在文件中添加ConfigMap 和
的导入语句:Optional
GreetingConfiguration.java
文件示例package org.acme.config; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import java.util.Optional; @ConfigMapping(prefix = "greeting") 1 public interface GreetingConfiguration { String message(); @WithDefault("!") 2 String suffix(); Optional<String> name(); }
使用
@Inject
注释将GreetingConfiguration
实例注入到GreetingResource
类中,如下所示:注意此片段将标注为
@ConfigProperty
的三个字段替换为config-quickstart
项目初始版本中的 @ConfigProperty。GreetingResource.java
文件示例package org.acme.config; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; @Path("/greeting") public class GreetingResource { @Inject GreetingConfiguration config; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return config.message() + " " + config.name().orElse("world") + config.suffix(); } }
在开发模式下编译并启动应用程序:
./mvnw quarkus:dev
重要如果没有为类属性提供值,则应用无法编译,并且返回
io.smallrye.config.ConfigValidationException
错误来指示缺少值。这不适用于带有默认值的可选字段或字段。要验证端点是否返回消息,请在新的终端窗口中输入以下命令:
curl http://localhost:8080/greeting
您会收到以下信息:
hello quarkus!
- 要停止应用程序,请按 Ctrl+C。
1.6.2. 使用嵌套对象配置
您可以定义嵌套在另一个接口中的接口。此流程演示了如何在 Quarkus config-quickstart
项目中创建和配置嵌套接口。
先决条件
-
您已创建了 Quarkus
config-quickstart
项目。 -
您已在项目的
application.properties
文件中定义greeting.message
和greeting.name
属性。
步骤
查看项目中的
GreetingResource.java
。该文件包含带有hello ()
方法的GreetingResource
类,它会在/greeting
端点上发送 HTTP 请求时返回一条消息:GreetingResource.java
文件示例package org.acme.config; import java.util.Optional; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.eclipse.microprofile.config.inject.ConfigProperty; @Path("/greeting") public class GreetingResource { @ConfigProperty(name = "greeting.message") String message; @ConfigProperty(name = "greeting.suffix", defaultValue="!") String suffix; @ConfigProperty(name = "greeting.name") Optional<String> name; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return message + " " + name.orElse("world") + suffix; } }
使用
GreetingConfiguration.java
类文件创建GreetingConfiguration
.java 类文件。此类包含hello ()
方法的外部化配置,该方法在GreetingResource
类中定义的:GreetingConfiguration.java
文件示例package org.acme.config; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import java.util.Optional; @ConfigMapping(prefix = "greeting") public interface GreetingConfiguration { String message(); @WithDefault("!") String suffix(); Optional<String> name(); }
创建嵌套在
GreetingConfiguration
实例中的ContentConfig
接口,如下例所示:GreetingConfiguration.java
文件示例package org.acme.config; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import java.util.List; import java.util.Optional; @ConfigMapping(prefix = "greeting") public interface GreetingConfiguration { String message(); @WithDefault("!") String suffix(); Optional<String> name(); ContentConfig content(); interface ContentConfig { Integer prizeAmount(); List<String> recipients(); } }
注意ContentConfig
接口的方法名称是内容
。要确保将属性绑定到正确的接口,当您为此类定义配置属性时,请在前缀中使用内容
。这样,您还可以防止属性名称冲突和意外的应用程序行为。在
application.properties
文件中定义greeting.content.prize-amount
和greeting.content.recipients
配置属性。以下示例显示了为
GreetingConfiguration
实例和ContentConfig
接口定义的属性:application.properties
文件示例greeting.message=hello greeting.name=quarkus greeting.content.prize-amount=10 greeting.content.recipients=Jane,John
使用
@Inject
注释,而不是三个@ConfigProperty
字段注释,将GreetingConfiguration
实例注入到GreetingResource
类中,如以下示例中所述。另外,您必须更新/greeting
端点返回的消息字符串,为新的 greeting.content.prize-amount 和
属性设置的值。greeting
.content.recipientsGreetingResource.java
文件示例package org.acme.config; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import jakarta.inject.Inject; @Path("/greeting") public class GreetingResource { @Inject GreetingConfiguration config; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return config.message() + " " + config.name().orElse("world") + config.suffix() + "\n" + config.content().recipients() + " receive total of candies: " + config.content().prizeAmount(); } }
在开发模式下编译并启动应用程序:
./mvnw quarkus:dev
重要如果没有为类属性提供值,应用程序将无法编译,并且您收到表示缺少值的
jakarta.enterprise.inject.spi.DeploymentException
异常。这不适用于带有默认值的可选字段和字段。要验证端点是否返回消息,请打开一个新的终端窗口并输入以下命令:
curl http://localhost:8080/greeting
这时将显示一条消息,其中包含 输出的两行。第一行显示问候语,第二行报告奖品的接收者和奖品量,如下所示:
hello quarkus! [Jane, John] receive total of candies: 10
- 要停止应用程序,请按 Ctrl+C。
您可以使用类似以下示例的 bean 验证注解 @ConfigMapping
注解的类:
@ConfigMapping(prefix = "greeting") public class GreetingConfiguration { @Size(min = 20) public String message; public String suffix = "!"; }
您的项目必须包含 quarkus-hibernate-validator
依赖项。
1.7. 以编程方式访问配置
您可以在代码中定义一个方法,以检索应用程序中的配置属性值。这样,您可以动态查找配置属性值,或者从 CDI Bean 或 Jakarta REST (以前称为 JAX-RS)资源的类中检索配置属性值。
您可以使用 org.eclipse.microprofile.config.ConfigProvider.getConfig ()
方法来访问配置。config
对象的 getValue ()
方法返回配置属性的值。
先决条件
- 您有一个 Quarkus Maven 项目。
步骤
使用方法访问应用程序代码中任何类或对象的 configuration 属性的值。根据您要检索的值是否在项目中的配置源中设置,您可以使用以下方法之一:
要访问项目中配置源中设置的属性值,例如在
application.properties
文件中,使用getValue ()
方法:String <variable-name> = ConfigProvider.getConfig().getValue("<property-name>", <data-type-class-name>.class);
例如,要检索数据类型为
String
的greeting.message
属性的值,并分配给代码中的消息
变量,请使用以下语法:String message = ConfigProvider.getConfig().getValue("greeting.message",String.class);
当您想检索一个可选或默认值的值,且可能无法在
application.properties
文件中定义,或使用getOptionalValue ()
方法:Optional<String> <variable-name> = ConfigProvider.getConfig().getOptionalValue("<property-name>", <data-type-class-name>.class);
例如,要检索可选的
greeting.name
属性的值,且具有数据类型String
,并分配给代码中name
变量,请使用以下语法:Optional<String> name = ConfigProvider.getConfig().getOptionalValue("greeting.name", String.class);
以下片段演示了上述使用编程访问配置的 GreetingResource
类的变体:
src/main/java/org/acme/config/GreetingResource.java
package org.acme.config; import java.util.Optional; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.ConfigProvider; import org.eclipse.microprofile.config.inject.ConfigProperty; @Path("/greeting") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { Config config = ConfigProvider.getConfig(); String message = config.getValue("greeting.message", String.class); String suffix = config.getOptionalValue("greeting.suffix", String.class).orElse("!"); Optional<String> name = config.getOptionalValue("greeting.name", String.class); return message + " " + name.orElse("world") + suffix; } }
1.8. 属性表达式
您可以将属性引用和文本字符串组合成属性表达式,并将这些表达式用作 Quarkus 配置中的值。
与变量一样,属性表达式会动态地替换配置属性值,避免硬编码的值。
您可以在一个配置源中扩展表达式,其值在另一个定义。
当 java.util.Properties
从配置来源读取属性值时,应用会解析属性表达式:如果读取,并在运行时进行编译(如果在该时间点上被覆盖)。
如果应用无法解析表达式中的属性值,并且属性没有默认值,则应用会抛出 NoSuchElementException
错误。
1.8.1. 属性表达式的使用示例
要在配置 Quarkus 应用程序时获得灵活性,您可以使用属性表达式,如下例所示。
替换配置属性的值:
为了避免配置中硬编码属性值,您可以使用属性表达式。使用
${<property_name>}
语法编写引用配置属性的表达式,如下例所示:application.properties
文件示例remote.host=quarkus.io callable.url=https://${remote.host}/
callable.url
属性的值解析为https://quarkus.io/
。设置特定于特定配置配置集的属性值:
在以下示例中,将
%dev
配置配置文件和默认配置配置文件设置为使用带有不同主机地址的数据源连接 URL。application.properties
文件示例%dev.quarkus.datasource.jdbc.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false quarkus.datasource.jdbc.url=jdbc:mysql://remotehost:3306/mydatabase?useSSL=false
根据用于启动应用程序的配置配置文件,您的数据源驱动程序使用您为配置集设置的数据库 URL。
您可以通过为每个配置配置集设置自定义
application.server
属性的不同值,以简化相同的结果。然后,您可以引用应用程序的数据库连接 URL 中的属性,如下例所示:application.properties
文件示例%dev.application.server=localhost application.server=remotehost quarkus.datasource.jdbc.url=jdbc:mysql://${application.server}:3306/mydatabase?useSSL=false
application.server
属性解析为适当的值,具体取决于您在运行应用程序时选择的配置集。设置属性表达式的默认值:
您可以为属性表达式定义一个默认值。如果扩展表达式所需的属性值没有从任何配置源解析,则 quarkus 使用默认值。您可以使用以下语法为表达式设置默认值:
${<property_name>:<default_value>}
在以下示例中,数据源 URL 中的属性表达式使用
mysql.db.server
作为application.server
属性的默认值:application.properties
文件示例quarkus.datasource.jdbc.url=jdbc:mysql://${application.server:mysql.db.server}:3306/mydatabase?useSSL=false
嵌套属性表达式:
您可以通过在另一个属性表达式中嵌套属性表达式来编写属性表达式。当扩展嵌套属性表达式时,首先扩展 inner 表达式。您可以使用以下语法嵌套属性表达式:
${<outer_property_name>${<inner_property_name>}}
合并多个属性表达式:
您可以使用以下语法将两个或者多个属性表达式加入到一起:
${<first_property_name>}${<second_property_name>}
将属性表达式和环境变量合并:
您可以使用属性表达式替换环境变量的值。以下示例中的表达式替换为
HOST
环境变量设置的值作为application.host
属性的值:application.properties
文件示例remote.host=quarkus.io application.host=${HOST:${remote.host}}
如果没有设置 HOST
环境变量,application.host
属性将使用 remote.host
属性的值作为默认值。
1.9. 使用配置配置集
您可以根据您的环境使用不同的配置配置集。使用配置文件,您可以在同一文件中有多个配置,并使用配置文件名称在它们之间进行选择。
Red Hat build of Quarkus 有三个默认配置配置集:
- Dev: 在开发模式中激活
- 测试 :在运行测试时激活
- prod :当没有以 development 或 test 模式运行时的默认配置集
另外,您可以创建自己的自定义配置集。
先决条件
您有一个 Quarkus Maven 项目。
步骤
打开 Java 资源文件并添加以下导入语句:
import io.quarkus.runtime.configuration.ConfigUtils;
要获取当前配置集的列表,请通过调用
ConfigUtils.getProfiles ()
方法来添加日志:LOGGER.infof("The application is starting with profiles `%s`", ConfigUtils.getProfiles());
其他资源
- 有关使用日志记录 API、配置日志输出和使用日志记录适配器进行统一输出的更多信息,请参阅 日志配置。
1.9.1. 设置自定义配置配置集
您可以根据需要创建任意数量的配置配置集。同一文件中可以有多个配置,您可以使用配置集名称选择配置。
步骤
要设置自定义配置集,请在
application.properties
文件中使用配置集名称创建一个配置属性,其中 <property_name
> 是属性的名称,<value>
; 是属性值,<profile
> 是配置集的名称:创建配置属性
%<profile>.<property_name>=<value>
在以下示例配置中,
quarkus.http.port
的值默认为9090
,并在激活dev
配置集时变为8181
:配置示例
quarkus.http.port=9090 %dev.quarkus.http.port=8181
使用以下方法之一启用配置集:
设置
quarkus.profile
系统属性。要使用
quarkus.profile
系统属性启用配置集,请输入以下命令:使用
quarkus.profile
属性启用配置集mvn -Dquarkus.profile=<value> quarkus:dev
设置
QUARKUS_PROFILE
环境变量。要使用环境变量启用配置集,请输入以下命令:
使用环境变量启用配置集
export QUARKUS_PROFILE=<profile>
注意系统属性值优先于环境变量值。
要重新打包应用程序并更改配置集,请输入以下命令:
更改配置集
./mvnw package -Dquarkus.profile=<profile> java -jar target/quarkus-app/quarkus-run.jar
以下示例显示了激活
prod-aws
配置集的命令:激活配置集的命令示例
./mvnw package -Dquarkus.profile=prod-aws java -jar target/quarkus-app/quarkus-run.jar
默认 Quarkus 应用程序运行时配置集设置为用于构建应用程序的配置集。Red Hat build of Quarkus 会自动根据您的环境模式选择配置集。例如,当应用程序作为 JAR 运行时,Quarkus 处于 prod
模式。
1.10. 设置自定义配置源
默认情况下,Quarkus 应用程序从项目的 src/main/resources
子目录中的 application.properties
文件读取属性。使用 Quarkus,您可以根据外部配置的 MicroProfile 配置规范从其他来源加载应用配置属性。您可以通过定义实施 org.eclipse.microprofile.config.spi.ConfigSource 和 org.eclipse.microprofile.config
从其他来源加载配置属性。此流程演示了如何在 Quarkus 项目中实施自定义配置源。
.spi.ConfigSource
的类,使应用能够
前提条件
您有 Quarkus config-quickstart
项目。
对于该项目的完整示例,请下载 Quarkus Quickstarts 存档或克隆 Quarkus Quickstarts Git 存储库,再进入 config-quickstart
目录。
步骤
在您的项目中,创建一个实施
org.eclipse.microprofile.config.spi.ConfigSourceProvider
接口的新类。覆盖getConfigSources ()
方法,以返回自定义ConfigSource
对象列表。org.acme.config.InMemoryConfigSourceProvider
示例package org.acme.config; import org.eclipse.microprofile.config.spi.ConfigSource; import org.eclipse.microprofile.config.spi.ConfigSourceProvider; import java.util.List; public class InMemoryConfigSourceProvider implements ConfigSourceProvider { @Override public Iterable<ConfigSource> getConfigSources(ClassLoader classLoader) { return List.of(new InMemoryConfigSource()); } }
要定义您的自定义配置源,请创建一个实现
org.eclipse.microprofile.config.spi.ConfigSource
接口的InMemoryConfigSource
类:org.acme.config.InMemoryConfigSource
示例package org.acme.config; import org.eclipse.microprofile.config.spi.ConfigSource; import java.util.HashMap; import java.util.Map; import java.util.Set; public class InMemoryConfigSource implements ConfigSource { private static final Map<String, String> configuration = new HashMap<>(); static { configuration.put("my.prop", "1234"); } @Override public int getOrdinal() { 1 return 275; } @Override public Set<String> getPropertyNames() { return configuration.keySet(); } @Override public String getValue(final String propertyName) { return configuration.get(propertyName); } @Override public String getName() { return InMemoryConfigSource.class.getSimpleName(); } }
- 1
getOrdinal ()
方法返回ConfigSource
类的优先级。因此,当多个配置源定义同一属性时,Quarkus 可以选择适当的值,如具有最高优先级的ConfigSource
类定义。
在项目的
src/main/resources/META-INF/services/
子目录中,创建名为org.eclipse.microprofile.config.spi.ConfigSourceProvider
的文件,并在您创建的文件中输入实施ConfigSourceProvider
的类的完全限定域名:org.eclipse.microprofile.config.spi.ConfigSourceProvider
文件示例:org.acme.config.InMemoryConfigSourceProvider
要确保在编译和启动应用程序时注册并安装您创建的
ConfigSourceProvider
,您必须完成上一步。编辑项目中的
GreetingResource.java
文件,添加以下更新:@ConfigProperty(name="my.prop") int value;
在
GreetingResource.java
文件中,扩展hello
方法以使用新属性:@GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return message + " " + name.orElse("world") + " " + value; }
在开发模式下编译并启动应用程序:
./mvnw quarkus:dev
打开终端窗口并发送请求到
/greeting
端点:curl http://localhost:8080/greeting
验证您的应用程序是否已读取自定义配置并返回预期信息:
hello world 1234
1.11. 使用自定义配置转换器作为配置值
您可以通过实施 org.eclipse.microprofile.config.spi.Converter<T> 将自定义类型
存储为配置值,并将其完全限定类名称添加到 META-INF/services/org.eclipse.microprofile.config.spi.Converter
文件中。通过使用转换器,您可以将值的字符串表示转换为对象。
先决条件
您已创建了 Quarkus config-quickstart
项目。
步骤
在
org.acme.config
软件包中,使用以下内容创建org.acme.config.MyCustomValue
类:自定义配置值示例
package org.acme.config; public class MyCustomValue { private final int value; public MyCustomValue(Integer value) { this.value = value; } public int value() { return value; } }
实施转换器类,以覆盖生成
MyCustomValue
实例的转换方法。转换类的实现示例
package org.acme.config; import org.eclipse.microprofile.config.spi.Converter; public class MyCustomValueConverter implements Converter<MyCustomValue> { @Override public MyCustomValue convert(String value) { return new MyCustomValue(Integer.valueOf(value)); } }
-
将转换器的完全限定类名称
org.acme.config.MyCustomValueConverter
添加至您的META-INF/services/org.eclipse.microprofile.config.spi.Converter
服务文件。 在
GreetingResource.java
文件中,注入MyCustomValue
属性:@ConfigProperty(name="custom") MyCustomValue value;
编辑
hello
方法以使用此值:@GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return message + " " + name.orElse("world") + " - " + value.value(); }
在
application.properties
文件中,添加要转换的字符串表示:custom=1234
要在开发模式下编译并启动应用程序,请输入以下命令:
./mvnw quarkus:dev
要验证
/greeting
端点是否返回预期消息,请打开终端窗口并输入以下命令:curl http://localhost:8080/greeting
当应用程序成功读取自定义配置时,命令会返回以下响应:
hello world - 1234
注意您的自定义转换器类必须
是公共的
,且必须有一个公共
的 no-argument 构造器。您的自定义转换器类不能抽象
。
1.11.1. 设置自定义转换器优先级
所有 Quarkus 核心转换器的默认优先级都是 200。对于所有其他转换器,默认优先级为 100。您可以使用 jakarta.annotation.Priority
注解来增加自定义转换器的优先级。
以下流程演示了自定义转换器的实施,即 AnotherCustomValueConverter
,其优先级为 150。这优先于上一节中的 MyCustomValueConverter
,其默认优先级为 100。
先决条件
-
您已创建了 Quarkus
config-quickstart
项目。 - 您已为应用程序创建了自定义配置转换器。
步骤
通过为自定义转换器添加
@Priority
注释并传递优先级值,为您的自定义转换器设置优先级。在以下示例中,优先级值设置为150
。AnotherCustomValueConverter.java
文件示例package org.acme.config; import jakarta.annotation.Priority; import org.eclipse.microprofile.config.spi.Converter; @Priority(150) public class AnotherCustomValueConverter implements Converter<MyCustomValue> { @Override public MyCustomValue convert(String value) { return new MyCustomValue(Integer.valueOf(value)); } }
在项目的
src/main/resources/META-INF/services/
子目录中创建名为org.eclipse.microprofile.config.spi.Converter
的文件,然后在您创建的文件中输入实现Converter
的类的完全限定名称:示例
org.eclipse.microprofile.config.spi.Converter
fileorg.acme.config.AnotherCustomValueConverter
您必须完成上一步,以确保在编译和启动应用程序时注册并安装您创建的
Converter
。
验证
完成所需的配置后,下一步是编译并打包您的 Quarkus 应用程序。如需更多信息和示例,请参阅 Getting started with Quarkus 指南中的 compiling and packaging 部分。
1.12. 其他资源
更新于 2025-03-16