配置 Quarkus 应用程序


Red Hat build of Quarkus 1.11

摘要

本指南论述了如何配置 Quarkus 应用程序。

前言

作为应用程序开发人员,您可以使用红帽构建的 Quarkus 来创建在 OpenShift 和无服务器环境中运行的 Java 编写的基于微服务的应用程序。编译到原生可执行文件的应用程序会占用较少的内存占用空间和快速启动时间。

本指南介绍了如何使用 Eclipse MicroProfile Config 方法或 YAML 格式配置 Quarkus 应用。该流程包括使用 Quarkus config-quickstart 操作创建的配置示例。

先决条件

对红帽文档提供反馈

我们非常感谢您对我们的技术内容提供反馈,并鼓励您告诉我们您的想法。如果您想添加评论,提供见解、纠正拼写错误甚至询问问题,您可以在文档中直接这样做。

注意

您必须有一个红帽帐户并登录到客户门户网站。

要从客户门户网站提交文档反馈,请执行以下操作:

  1. 选择 Multi-page HTML 格式。
  2. 点文档右上角的 反馈 按钮。
  3. 突出显示您要提供反馈的文本部分。
  4. 点高亮文本旁的添加反馈对话框。
  5. 在页面右侧的文本框中输入您的反馈,然后单击 Submit

每次提交反馈时,我们都会自动创建跟踪问题。打开在点 Submit 后显示的链接,并开始监视问题或添加更多注释。

感谢您的宝贵反馈。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

第 1 章 Red Hat build of Quarkus 配置选项

配置选项允许您在单一配置文件中更改应用程序的设置。Quarkus 支持配置配置文件,允许您根据需要对配置集进行分组,并在配置集间切换。

您可以使用 Eclipse MicroProfile 项目中的 MicroProfile 配置规范将配置属性注入到应用中,并使用代码中定义的方法进行配置。默认情况下,Quarkus 从 src/main/resources 目录中的 application.properties 文件中读取属性。

通过将 config-yaml 依赖项添加到项目 pom.xml 文件中,您可以使用 YAML 格式在 application.yaml 文件中添加应用程序属性。

Quarkus 也可以从不同来源读取应用程序属性,如文件系统、数据库或 Java 应用程序可加载的任何源。

第 2 章 创建配置快速启动项目

config-quickstart 项目可让您使用 Apache Maven 和 Quarkus Maven 插件使用简单的 Quarkus 应用程序启动并运行。以下流程演示了如何创建 Quarkus Maven 项目。

流程

  1. 验证 Maven 是否使用 JDK 11,并且 Maven 版本是否为 3.8.1 或更高版本:

    mvn --version
    Copy to Clipboard Toggle word wrap

    如果这个命令没有返回 JDK 11,请确保在您的系统中安装 JDK 11 的目录包含在 PATH 环境变量中:

    export PATH=$PATH:/path/to/jdk-11
    Copy to Clipboard Toggle word wrap
  2. 输入以下命令来生成项目:

    mvn io.quarkus:quarkus-maven-plugin:1.11.7.Final-redhat-00009:create \
        -DprojectGroupId=org.acme \
        -DprojectArtifactId=config-quickstart \
        -DplatformGroupId=com.redhat.quarkus \
        -DplatformVersion=1.11.7.Final-redhat-00009 \
        -DclassName="org.acme.config.GreetingResource" \
        -Dpath="/greeting"
    cd config-quickstart
    Copy to Clipboard Toggle word wrap

    此命令在 config-quickstart 目录中创建以下项目:

    • Maven 项目目录结构
    • org.acme.config.GreetingResource 资源
    • 在启动应用程序后,您可以在 http://localhost:8080 访问的登录页面
    • 在原生模式和 JVM 模式中测试应用程序的相关单元测试
    • src/main/docker中的 Dockerfile.jvmDockerfile.nativeDockerfile.fast-jar 文件示例
    • 应用程序配置文件

      注意

      或者,您还可以从 Quarkus quickstart 存档 下载 Quarkus Maven 项目,或克隆 Quarkus Quickstarts Git 存储库。实践位于 config-quickstart 目录中。

您可以使用所有可用配置值和应用程序配置的扩展创建 application.properties.example 文件。您可以在安装新扩展后重复这个过程,以查看添加哪些附加配置选项。

先决条件

  • 具有 Quarkus Maven 项目。

流程

  • 运行以下命令来创建 application.properties.example 文件:

    ./mvnw quarkus:generate-config
    Copy to Clipboard Toggle word wrap

    此命令在 src/main/resources/ 目录中创建 application.properties.example 文件。该文件包含通过您安装的扩展公开的所有配置选项。这些选项会被注释掉,并在适用的情况下具有默认值。

    以下示例显示了 application.properties.example 文件中的 HTTP 端口配置条目:

    #quarkus.http.port=8080
    Copy to Clipboard Toggle word wrap

第 4 章 将配置值注入 Quarkus 应用程序

红帽构建的 Quarkus 使用 MicroProfile Config 功能 将配置数据注入应用程序中。您可以通过上下文和依赖项注入(CDI)或使用代码中定义的方法访问配置。

您可以使用 @ConfigProperty 注释将对象属性映射到应用的 MicroProfile ConfigSources 文件中的键。此流程演示了如何将单个属性配置注入 Quarkus config-quickstart 项目中。

先决条件

  • 您已创建了 Quarkus config-quickstart 项目。

流程

  1. 打开 src/main/resources/application.properties 文件。
  2. 在您的配置文件中添加配置属性,其中 &lt ;key& gt; 是属性名称,< value> 是属性值:

    <key>=<value>
    Copy to Clipboard Toggle word wrap

    以下示例演示了如何为 Quarkus config-quickstart 项目中的 greeting.messagegreeting.name 属性设置值:

    src/main/resources/application.properties

    greeting.message = hello
    greeting.name = quarkus
    Copy to Clipboard Toggle word wrap

    重要

    使用 Quarkus 作为 Quarkus 属性的前缀。

  3. 查看 GreetingResource.java 文件,并确保它包括以下导入语句:

    import org.eclipse.microprofile.config.inject.ConfigProperty;
    import java.util.Optional;
    Copy to Clipboard Toggle word wrap
  4. 通过使用 @ConfigProperty 注解它们来定义对应的属性,如下例所示:

    src/main/java/org/acme/config/GreetingResource.java

    @ConfigProperty(name = "greeting.message") 
    1
    
    String message;
    
    @ConfigProperty(name = "greeting.suffix", defaultValue="!") 
    2
    
    String suffix;
    
    @ConfigProperty(name = "greeting.name")
    Optional<String> name; 
    3
    Copy to Clipboard Toggle word wrap

    1
    如果没有为此属性提供值,应用程序将失败并抛出以下异常信息:
    javax.enterprise.inject.spi.DeploymentException: No config value type [class java.lang.String] for: greeting.message
    2
    如果没有为 greeting.suffix 提供值,则 Quarkus 会将它解析为默认值。
    3
    如果 Optional 参数没有值,它将没有为 greeting.name 返回值。
    注意

    要注入配置的值,您可以使用 @ConfigProperty。使用 @ConfigProperty 注解的成员不需要 @Inject 注释。

  5. 编辑 hello 方法以返回以下信息:

    src/main/java/org/acme/config/GreetingResource.java

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return message + "  " + name.orElse("world") + suffix;
    }
    Copy to Clipboard Toggle word wrap

  6. 以开发模式编译并启动应用程序:

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
  7. 在新终端窗口中输入以下命令来验证端点是否返回消息:

    curl http://localhost:8080/greeting
    Copy to Clipboard Toggle word wrap

    这个命令返回以下输出:

    hello quarkus!
    Copy to Clipboard Toggle word wrap
  8. CTRL+C 停止应用程序。

4.1. 使用 @ConfigProperties 注解类

作为单独注入多个相关配置值的替代选择,您可以使用 @io.quarkus.arc.config.ConfigProperties 注解来对组配置属性使用。以下流程演示了在 Quarkus config-quickstart 项目中使用 @ConfigProperties 注释。

先决条件

  • 您已创建了 Quarkus config-quickstart 项目。

流程

  1. 查看 GreetingResource.java 文件,并确保它包括以下导入语句:

    src/main/java/org/acme/config/GreetingResource.java

    import java.util.Optional;
    import javax.inject.Inject;
    Copy to Clipboard Toggle word wrap

  2. src/main/java/org/acme/config 目录中创建一个文件 GreetingConfiguration.java
  3. ConfigPropertiesOptional 导入添加到 GreetingConfiguration.java 文件中:

    src/main/java/org/acme/config/GreetingConfiguration.java

    import io.quarkus.arc.config.ConfigProperties;
    import java.util.Optional;
    import javax.inject.Inject;
    Copy to Clipboard Toggle word wrap

  4. GreetingConfiguration.java 文件中的 问候 属性创建一个 GreetingConfiguration 类:

    src/main/java/org/acme/config/GreetingConfiguration.java

    @ConfigProperties(prefix = "greeting") 
    1
    
    public class GreetingConfiguration {
    
        private String message;
        private String suffix = "!"; 
    2
    
        private Optional<String> name;
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public String getSuffix() {
            return suffix;
        }
    
        public void setSuffix(String suffix) {
            this.suffix = suffix;
        }
    
        public Optional<String> getName() {
            return name;
        }
    
        public void setName(Optional<String> name) {
            this.name = name;
        }
    }
    Copy to Clipboard Toggle word wrap

    1
    prefix 是可选的。如果没有指定前缀,它由类的名称决定。在本例中,前缀为 greeting
    2
    如果没有设置 greeting.suffix! 是默认值。
  5. 使用 @Inject 注解将 GreetingConfiguration 类注入 GreetingResource 类:

    src/main/java/org/acme/config/GreetingResource.java

    @Path("/greeting")
    public class GreetingResource {
    
        @Inject
        GreetingConfiguration config;
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String hello() {
            return config.getMessage() + " " + config.getName().orElse("world") + config.getSuffix();
        }
    }
    Copy to Clipboard Toggle word wrap

  6. 以开发模式编译并启动应用程序:

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
    重要

    如果没有为类属性提供值,应用程序无法编译,您会收到 javax.enterprise.inject.spi.DeploymentException,它表示缺失的值。这不适用于带有 默认值的 Optional 字段和字段。

  7. 在新终端窗口中输入以下命令来验证端点是否返回消息:

    curl http://localhost:8080/greeting
    Copy to Clipboard Toggle word wrap
  8. 您会收到以下信息:

    hello quarkus!
    Copy to Clipboard Toggle word wrap
  9. CTRL+C 停止应用程序。

4.2. 使用嵌套对象配置

您可以在现有类中定义嵌套类。此流程演示了如何在 Quarkus config-quickstart 项目中创建嵌套类配置。

先决条件

  • 您已创建了 Quarkus config-quickstart 项目。

流程

  1. 查看 GreetingConfiguration.java 文件,并确保它包括以下导入语句:

    src/main/java/org/acme/config/GreetingConfiguration.java

    import io.quarkus.arc.config.ConfigProperties;
    import java.util.Optional;
    import java.util.List;
    Copy to Clipboard Toggle word wrap

  2. 使用 @ConfigProperties 注释在 GreetingConfiguration.java 文件中添加配置。

    以下示例显示了 GreetingConfiguration 类及其属性的配置:

    src/main/java/org/acme/config/GreetingConfiguration.java

    @ConfigProperties(prefix = "greeting")
    public class GreetingConfiguration {
    
        public String message;
        public String suffix = "!";
        public Optional<String> name;
    }
    Copy to Clipboard Toggle word wrap

  3. GreetingConfiguration 类中添加一个嵌套类,如下例所示:

    src/main/java/org/acme/config/GreetingConfiguration.java

    @ConfigProperties(prefix = "greeting")
    public class GreetingConfiguration {
    
        public String message;
        public String suffix = "!";
        public Optional<String> name;
        public ContentConfig content;
    
        public static class ContentConfig {
            public Integer prizeAmount;
            public List<String> recipients;
        }
    }
    Copy to Clipboard Toggle word wrap

    本例显示了一个嵌套类 ContentConfig。字段的名称(本例中为 content )决定了绑定到对象的属性的名称。

  4. application.properties 文件中设置 greeting.content.prize-amountgreeting.content.recipients 配置属性。

    以下示例显示了 GreetingConfigurationContentConfig 类的属性值:

    src/main/resources/application.properties

    greeting.message = hello
    greeting.name = quarkus
    greeting.content.prize-amount=10
    greeting.content.recipients=Jane,John
    Copy to Clipboard Toggle word wrap

  5. 使用 @Inject 注解将 GreetingConfiguration 类注入 GreetingResource 类,并更新 /greeting 端点返回的消息字符串,显示您为新 greeting.content.prize-amountgreeting.content.recipients 属性设置的值:

    src/main/java/org/acme/config/GreetingResource.java

    @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;
        }
    }
    Copy to Clipboard Toggle word wrap

  6. 以开发模式编译并启动应用程序:

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
    重要

    如果没有为类属性提供值,应用程序无法编译,您会收到 javax.enterprise.inject.spi.DeploymentException,它表示缺失的值。这不适用于带有 默认值的 Optional 字段和字段。

  7. 在新终端窗口中输入以下命令来验证端点是否返回消息:

    curl http://localhost:8080/greeting
    Copy to Clipboard Toggle word wrap
  8. 您会收到一条信息,其中包含第一行上的问候以及第二行上的原概量:

    hello quarkus!
    Jane,John receive total of candies: 10
    Copy to Clipboard Toggle word wrap
  9. CTRL+C 停止应用程序。
注意

使用 @ConfigProperties 注解的类可以使用与以下示例类似的 Bean Validation 注解添加注解:

@ConfigProperties(prefix = "greeting")
public class GreetingConfiguration {

    @Size(min = 20)
    public String message;
    public String suffix = "!";
}
Copy to Clipboard Toggle word wrap

您的项目必须包含 quarkus-hibernate-validator 依赖项。

4.3. 使用 @ConfigProperties 注解接口

管理属性的替代方法是将它们定义为接口。如果您使用 @ConfigProperties 注解接口,接口可以扩展其他接口,您可以使用整个接口层次结构中的方法绑定属性。

此流程演示了 GreetingConfiguration 类的实现作为 Quarkus config-quickstart 项目中的接口。

先决条件

  • 您已创建了 Quarkus config-quickstart 项目。

流程

  1. 查看 GreetingConfiguration.java 文件,并确保它包括以下导入语句:

    src/main/java/org/acme/config/GreetingConfiguration.java

    import io.quarkus.arc.config.ConfigProperties;
    import org.eclipse.microprofile.config.inject.ConfigProperty;
    import java.util.Optional;
    Copy to Clipboard Toggle word wrap

  2. GreetingConfiguration 类作为接口添加到 GreetingConfiguration.java 文件中:

    src/main/java/org/acme/config/GreetingConfiguration.java

    @ConfigProperties(prefix = "greeting")
    public interface GreetingConfiguration {
    
        @ConfigProperty(name = "message") 
    1
    
        String message();
    
        @ConfigProperty(defaultValue = "!")
        String getSuffix(); 
    2
    
    
        Optional<String> getName(); 
    3
    
    }
    Copy to Clipboard Toggle word wrap

    1
    您必须设置 @ConfigProperty 注释,因为配置属性的名称不遵循 getter 方法命名约定。
    2
    在本例中,没有设置 name,因此对应的属性将为 greeting.suffix
    3
    您不需要指定 @ConfigProperty 注释,因为方法名称遵循 getter 方法命名约定(greeting.name 作为对应属性),且不需要默认值。
  3. 使用 @Inject 注解将 GreetingConfiguration 类注入 GreetingResource 类:

    src/main/java/org/acme/config/GreetingResource.java

    @Path("/greeting")
    public class GreetingResource {
    
        @Inject
        GreetingConfiguration config;
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String hello() {
            return config.message() + " " + config.getName().orElse("world") + config.getSuffix();
        }
    }
    Copy to Clipboard Toggle word wrap

  4. 以开发模式编译并启动应用程序:

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
    重要

    如果没有为类属性提供值,应用程序无法编译,您会收到 javax.enterprise.inject.spi.DeploymentException,它表示缺失的值。这不适用于带有 默认值的 Optional 字段和字段。

  5. 在新终端窗口中输入以下命令来验证端点是否返回消息:

    curl http://localhost:8080/greeting
    Copy to Clipboard Toggle word wrap
  6. 您会收到以下信息:

    hello quarkus!
    Copy to Clipboard Toggle word wrap
  7. CTRL+C 停止应用程序。

第 5 章 从代码访问配置

您可以使用代码中定义的方法访问配置。您可以实现动态查找,或从 CDI Bean 或 JAX-RS 资源的类检索配置的值。

您可以使用 org.eclipse.microprofile.config.ConfigProvider.getConfig () 方法访问配置。Config 对象的 getValue 方法返回配置属性的值。

先决条件

  • 您有一个 Quarkus Maven 项目。

流程

  • 使用以下选项之一访问配置:

    • 要访问已在 application.properties 文件中定义的属性的配置,请使用以下语法,其中 DATABASE.NAME 是分配给 databaseName 变量的属性名称:

      String databaseName = ConfigProvider.getConfig().getValue("DATABASE.NAME", String.class);
      Copy to Clipboard Toggle word wrap
    • 要访问在 application.properties 文件中定义的属性的配置,请使用以下语法:

      Optional<String> maybeDatabaseName = ConfigProvider.getConfig().getOptionalValue("DATABASE.NAME", String.class);
      Copy to Clipboard Toggle word wrap

第 6 章 设置配置属性

默认情况下,Quarkus 从 src/main/resources 目录中的 application.properties 文件中读取属性。如果您更改了构建属性,请确保重新打包您的应用程序。

Quarkus 在构建期间配置大多数属性。扩展可以将属性定义为可在运行时覆盖的属性,如数据库 URL、用户名和密码,并可特定于您的目标环境。

先决条件

  • 您有一个 Quarkus Maven 项目。

流程

  1. 要打包 Quarkus 项目,请输入以下命令:

    ./mvnw clean package
    Copy to Clipboard Toggle word wrap
  2. 使用以下方法之一设置配置属性:

    • 设置系统属性:

      输入以下命令,其中 & lt;key > 是要添加的配置属性的名称,&lt ;value > 是属性值:

      java -D<key>=<value> -jar target/myapp-runner.jar
      Copy to Clipboard Toggle word wrap

      例如,要设置 quarkus.datasource.password 属性的值,请输入以下命令:

      java -Dquarkus.datasource.password=youshallnotpass -jar target/myapp-runner.jar
      Copy to Clipboard Toggle word wrap
    • 设置环境变量:

      输入以下命令,其中 & lt;key > 是您要设置的配置属性的名称,&lt ;value > 是属性值:

      export <key>=<value> ; java -jar target/myapp-runner.jar
      Copy to Clipboard Toggle word wrap
      注意

      环境变量名称遵循 Eclipse MicroProfile 的转换规则。将名称转换为大写,并将不是字母数字的任何字符替换为下划线(_)。

    • 使用环境文件:

      在当前工作目录中创建 .env 文件,并添加配置属性,其中 < PROPERTY_KEY> 是属性名称,& lt;value > 是属性值:

      <PROPERTY_KEY>=<value>
      Copy to Clipboard Toggle word wrap
      注意

      对于开发模式,此文件可以位于项目的根目录中,但建议不要跟踪版本控制中的文件。如果在项目的根目录中创建 .env 文件,您可以定义程序以属性形式读取的键和值。

    • 使用 application.properties 文件。

      将配置文件放在 $PWD/config/application.properties 目录中,应用程序在其中运行,以便该文件中定义的任何运行时属性将覆盖默认配置。

      注意

      您还可以在开发模式中使用 config/application.properties 功能。将 config/application.properties 放置到 目标目录中。构建工具中的任何清理操作(如 mvn clean )也会删除 config 目录。

第 7 章 属性表达式

属性表达式是属性引用和纯文本字符串的组合,可用于替换配置中属性值。

与变量一样,您可以使用 Quarkus 中的属性表达式来替换配置属性的值,而不是硬编码它。当 java.util.Properties 从应用中的配置源读取属性值时,会解析属性表达式。

这意味着,如果在编译时读取配置属性,则属性表达式也会在编译时解析。如果在运行时覆盖了 configuration 属性,则其值会在运行时解析。

属性表达式可使用多个配置源解析。这意味着,您可以使用在一个配置源中定义的属性值来扩展您在另一个配置源中使用的属性表达式。

如果无法解析表达式中的属性值,并且您没有为表达式设置默认值,则您的应用程序会遇到 NoSuchElementException

7.1. 属性表达式用法示例

在本节中,您可以找到如何在配置 Quarkus 应用程序时如何使用属性表达式来获得更大的灵活性的示例。

  • 替换配置属性的值:

    您可以使用属性表达式来避免配置中硬编码属性值。使用 ${<property_name>} 语法编写引用配置属性的表达式,如下例所示:

    application.properties

    remote.host=quarkus.io
    callable.url=https://${remote.host}/
    Copy to Clipboard Toggle word wrap

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

  • 设置特定于特定配置配置文件的属性值:

    在以下示例中,%dev 配置配置文件和默认配置配置集被设置为将数据源连接 URL 与不同主机地址搭配使用。根据启动应用程序的配置配置集,您的数据源驱动程序会使用您为配置集设置的数据库 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
    Copy to Clipboard Toggle word wrap

    您可以通过为每个配置配置集设置自定义 application.server 属性的不同值来实现同样的结果。然后,您可以引用应用程序的数据库连接 URL 中的属性,如下例所示:

    application.properties

    %dev.application.server=localhost
    application.server=remotehost
    
    quarkus.datasource.jdbc.url=jdbc:mysql://${application.server}:3306/mydatabase?useSSL=false
    Copy to Clipboard Toggle word wrap

    application.server 属性根据您在运行应用程序时选择的配置集解析为适当的值。

  • 设置属性表达式的默认值:

    您可以为属性表达式定义默认值。如果扩展表达式所需的属性值没有从任何配置源解析,则quarkus 使用默认值。您可以使用以下语法设置表达式的默认值:

    ${<expression>:<default_value>}
    Copy to Clipboard Toggle word wrap

    在以下示例中,数据源 URL 中的属性表达式使用 mysql.db.server 作为 application.server 属性的默认值:

    application.properties

    quarkus.datasource.jdbc.url=jdbc:mysql://${application.server:mysql.db.server}:3306/mydatabase?useSSL=false
    Copy to Clipboard Toggle word wrap

  • 嵌套属性表达式:

    您可以通过在另一个属性表达式中嵌套属性表达式来编写属性表达式。当扩展嵌套属性表达式时,内部表达式会首先扩展:

    ${<outer_property_expression>${<inner_property_expression>}}
    Copy to Clipboard Toggle word wrap
  • 多个属性表达式:

    您可以将两个或多个属性表达式接合在一起,如下所示:

    ${<first_property>}${<second_property>}
    Copy to Clipboard Toggle word wrap
  • 将属性表达式与环境变量合并:

    您可以使用属性表达式来替换环境变量的值。以下示例中的表达式替换了为 HOST 环境变量设置的值,作为 application.host 属性的值。如果没有设置 HOST 环境变量,application.host 将使用 remote.host 属性的值作为默认值:

    application.properties

    remote.host=quarkus.io
    application.host=${HOST:${remote.host}}
    Copy to Clipboard Toggle word wrap

第 8 章 使用配置配置集

您可以根据您的环境使用不同的配置配置集。配置配置集可让您在同一文件中有多个配置,并使用配置集名称在它们之间进行选择。Red Hat build of Quarkus 有三个配置配置集。另外,您可以创建自己的自定义配置集。

Quarkus 默认配置集:

  • Dev: 在开发模式中激活
  • 测试 :运行测试时激活
  • prod :在没有以开发或测试模式下运行时的默认配置集

先决条件

  • 您有一个 Quarkus Maven 项目。

流程

  1. 打开 Java 资源文件并添加以下导入声明:

    import io.quarkus.runtime.configuration.ProfileManager;
    Copy to Clipboard Toggle word wrap
  2. 要显示当前的配置配置集,请添加调用 ProfileManager.getActiveProfile () 方法的日志:

    LOGGER.infof("The application is starting with profile `%s`", ProfileManager.getActiveProfile());
    Copy to Clipboard Toggle word wrap
    注意

    无法使用 @ConfigProperty ("quarkus.profile") 方法访问当前配置文件。

8.1. 设置自定义配置配置集

您可以根据需要创建任意数量的配置配置集。您可以在同一个文件中有多个配置,您可以使用配置集名称在它们之间进行选择。

流程

  1. 要设置自定义配置集,请在 application.properties 文件中使用配置集名称创建一个配置属性,其中 < key&gt; 是属性的名称,< value&gt; 是属性值,& lt;profile > 是配置集的名称:

     %<profile>.<key>=<value>
    Copy to Clipboard Toggle word wrap

    在以下示例中,quarkus.http.port 的值默认为 9090,当 dev 配置集被激活时会变为 8181 :

    quarkus.http.port=9090
    %dev.quarkus.http.port=8181
    Copy to Clipboard Toggle word wrap
  2. 使用以下方法之一启用配置集:

    • 设置 quarkus.profile 系统属性。

      • 要使用 quarkus.profile 系统属性启用配置集,请输入以下命令:

        mvn -Dquarkus.profile=<value> quarkus:dev
        Copy to Clipboard Toggle word wrap
    • 设置 QUARKUS_PROFILE 环境变量。

      • 要使用环境变量启用配置集,请输入以下命令:

        export QUARKUS_PROFILE=<profile>
        Copy to Clipboard Toggle word wrap
        注意

        system 属性值优先于环境变量值。

  3. 要重新打包应用程序并更改配置集,请输入以下命令:

    ./mvnw package -Dquarkus.profile=<profile>
     java -jar target/myapp-runner.jar
    Copy to Clipboard Toggle word wrap

    以下示例显示了激活 prod-aws 配置集的命令:

    ./mvnw package -Dquarkus.profile=prod-aws
     java -jar target/myapp-runner.jar
    Copy to Clipboard Toggle word wrap
注意

默认 Quarkus 应用程序运行时配置集设置为用于构建应用程序的配置集。Red Hat build of Quarkus 会自动根据您的环境模式选择一个配置集。例如,当您的应用程序以 JAR 身份运行时,Quarkus 处于 prod 模式。

第 9 章 设置自定义配置源

默认情况下,您的 Quarkus 应用从项目的 src/main/resources 子目录中的 application.properties 文件中读取属性。但是,由于 Quarkus 支持 MicroProfile Config,您也可以从其他来源加载应用的配置。您可以通过提供实现 org.eclipse.microprofile.config.spi.ConfigSource 和 org.eclipse.microprofile.config .spi.ConfigSource 接口的类,为您的配置的值引入自定义配置源。此流程演示了如何在 Quarkus 项目中实施自定义配置源。

前提条件

  • 具有 Quarkus config-quickstart 项目。

流程

  1. 在项目中创建 ExampleConfigSourceProvider.java 文件并添加以下导入:

    src/main/java/org/acme/config/ExampleConfigSourceProvider.java

    package org.acme.config;
    
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    
    import org.eclipse.microprofile.config.spi.ConfigSource;
    import org.eclipse.microprofile.config.spi.ConfigSourceProvider;
    Copy to Clipboard Toggle word wrap

  2. 创建一个实施 org.eclipse.microprofile.config.spi.ConfigSourceProvider 接口的类。您必须覆盖其 getConfigSources 方法,才能返回 ConfigSource 对象列表:

    以下示例显示了 ConfigSourceProviderConfigSource 接口的自定义实现:

    src/main/java/org/acme/config/ExampleConfigSourceProvider.java

    public class ExampleConfigSourceProvider implements ConfigSourceProvider {
    
        private final int times = 2;
        private final String name = "example";
        private final String value = "value";
    
        @Override
        public Iterable<ConfigSource> getConfigSources(ClassLoader forClassLoader) {
            InMemoryConfigSource configSource = new InMemoryConfigSource(Integer.MIN_VALUE, "example config source");
            for (int i = 0; i < this.times; i++) {
                configSource.add(this.name + ".key" + (i + 1), this.value + (i + 1));
            }
            return Collections.singletonList(configSource);
        }
    
        private static final class InMemoryConfigSource implements ConfigSource {
    
            private final Map<String, String> values = new HashMap<>();
            private final int ordinal;
            private final String name;
    
            private InMemoryConfigSource(int ordinal, String name) {
                this.ordinal = ordinal;
                this.name = name;
            }
    
            public void add(String key, String value) {
                values.put(key, value);
            }
    
            @Override
            public Map<String, String> getProperties() {
                return values;
            }
    
            @Override
            public Set<String> getPropertyNames() {
                return values.keySet();
            }
    
            @Override
            public int getOrdinal() {
                return ordinal;
            }
    
            @Override
            public String getValue(String propertyName) {
                return values.get(propertyName);
            }
    
            @Override
            public String getName() {
                return name;
            }
        }
    }
    Copy to Clipboard Toggle word wrap

  3. 在项目的 src/main/resources/META-INF/services/ 子目录中,创建一个名为 org.eclipse.microprofile.config.spi.ConfigSourceProvider 的文件,并在您创建的文件中输入实现 ConfigSourceProvider 的类的完全限定域名:

    src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSourceProvider

    org.acme.config.ExampleConfigSourceProvider
    Copy to Clipboard Toggle word wrap

    您必须执行此步骤,以确保在编译和启动应用程序时您创建的 ConfigSourceProvider 已注册并安装。

  4. 输入以下命令在开发模式中编译并启动应用程序:

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
  5. 在新终端窗口中输入以下命令来验证 /greeting 端点是否返回预期信息:

    curl http://localhost:8080/greeting
    Copy to Clipboard Toggle word wrap
  6. 当应用程序正确读取自定义配置时,您会收到以下响应:

    hello quarkus!
    Copy to Clipboard Toggle word wrap

第 10 章 使用自定义配置转换器作为配置值

您可以通过实施 org.eclipse.microprofile.config.spi.Converter<T&gt;,并将它完全限定类名称添加到 META-INF/services/org.eclipse.microprofile.config.spi.Converter 文件中。

先决条件

  • 您已创建了 Quarkus config-quickstart 项目。

流程

  1. 在您的 META-INF/services/org.eclipse.microprofile.config.spi.Converter 服务文件中包含转换器的完全限定类名称,如下例所示:

    org.acme.config.MicroProfileCustomValueConverter
    org.acme.config.SomeOtherConverter
    org.acme.config.YetAnotherConverter
    Copy to Clipboard Toggle word wrap
  2. 实现转换器类来覆盖转换方法:

    package org.acme.config;
    
    import org.eclipse.microprofile.config.spi.Converter;
    
    public class MicroProfileCustomValueConverter implements Converter<MicroProfileCustomValue> {
    
        @Override
        public MicroProfileCustomValue convert(String value) {
            return new MicroProfileCustomValue(Integer.valueOf(value));
        }
    }
    Copy to Clipboard Toggle word wrap
    注意

    您的自定义转换器类必须 是公共的,且必须 具有公共 no-argument 构造器。您的自定义转换器类无法 抽象

  3. 使用您的自定义类型作为配置值:

    @ConfigProperty(name = "configuration.value.name")
    MicroProfileCustomValue value;
    Copy to Clipboard Toggle word wrap

10.1. 设置自定义转换器优先级

所有 Quarkus 内核转换器的默认优先级为 200,所有其他转换器则设为 100。但是,您可以使用 javax.annotation.Priority 注解为您的自定义转换器设置更高的优先级。

以下流程演示了一个自定义转换器 MicroProfileCustomValue 的实施,其优先级为 150,其优先级将优先于 MicroProfileCustomValueConverter,其值为 100。

先决条件

  • 您已创建了 Quarkus config-quickstart 项目。

流程

  1. 在您的服务文件中添加以下导入语句:

    package org.acme.config;
    
    import javax.annotation.Priority;
    import org.eclipse.microprofile.config.spi.Converter;
    Copy to Clipboard Toggle word wrap
  2. 通过为自定义转换器添加带有 @Priority 注解的类并传递优先级值,为您的自定义转换器设置优先级:

    @Priority(150)
    public class MyCustomConverter implements Converter<MicroProfileCustomValue> {
    
        @Override
        public MicroProfileCustomValue convert(String value) {
    
            final int secretNumber;
            if (value.startsFrom("OBF:")) {
                secretNumber = Integer.valueOf(SecretDecoder.decode(value));
            } else {
                secretNumber = Integer.valueOf(value);
            }
    
            return new MicroProfileCustomValue(secretNumber);
        }
    }
    Copy to Clipboard Toggle word wrap
    注意

    如果添加新的转换器,您必须在 META-INF/services/org.eclipse.microprofile.config.spi.Converter 服务文件中列出它。

第 11 章 添加 YAML 配置支持

红帽构建的 Quarkus 通过 Eclipse MicroProfile 配置的 SmallRye Config 实现支持 YAML 配置文件。您可以添加 Quarkus Config YAML 扩展,并使用 YAML over 属性进行配置。Quarkus 支持使用 application.yml 以及 application.yaml 作为 YAML 文件的名称。

YAML 配置文件优先于 application.properties 文件。推荐的方法是删除 application.properties 文件,仅使用一种配置文件来避免错误。

流程

  • 使用以下方法之一在项目中添加 YAML 扩展:

    • 打开 pom.xml 文件,并将 quarkus-config-yaml 扩展添加为依赖项:

      <dependency>
          <groupId>io.quarkus</groupId>
          <artifactId>quarkus-config-yaml</artifactId>
      </dependency>
      Copy to Clipboard Toggle word wrap
    • 要从命令行添加 quarkus-config-yaml 扩展,请在项目目录中输入以下命令:

      ./mvnw quarkus:add-extension -Dextensions="quarkus-config-yaml"
      Copy to Clipboard Toggle word wrap

11.1. 使用带有 YAML 的嵌套对象配置

您可以在已经存在的类中定义嵌套类。此流程演示了如何使用 YAML 格式的配置文件为 Quarkus 应用程序设置嵌套配置属性。

先决条件

  • 具有 Quarkus Maven 项目。
  • 具有 PostgreSQL 数据源。
  • 在项目的 pom.xml 文件中有以下扩展作为依赖项:

    • quarkus-rest-client,
    • quarkus-jdbc-postgresql
    • quarkus-config-yaml

流程

  1. 打开 src/main/resources/application.yaml 配置文件。
  2. application.yaml 文件中添加嵌套类配置属性,如下例所示:

    src/main/resources/application.yaml

    # Properties that configure the JDBC data source driver of your PostgreSQL data source
    quarkus:
      datasource:
        url: jdbc:postgresql://localhost:5432/some-database
        driver: org.postgresql.Driver
        username: quarkus
        password: quarkus
    
    # Property that configures the URL of the endpoint to which the rest client sends requests
    org:
      acme:
        restclient:
          CountriesService/mp-rest/url: https://restcountries.eu/rest
    
    # Property that configures the log message level for your application
    quarkus:
      log:
        category:
          # Do not use spaces in names of configuration properties that you place inside quotation marks
          "io.quarkus.category":
            level: INFO
    Copy to Clipboard Toggle word wrap

    请注意,您可以使用注释来描述配置属性,其方式与在 application.properties 中使用它们类似。

    注意

    始终使用空格在 YAML 配置文件中缩进属性。YAML 不允许使用标签页来缩进。

11.2. 使用 YAML 设置自定义配置配置集

通过 Quarkus,您可以设置特定于应用程序的不同配置配置集的配置属性和值。您可以使用特定配置集启动应用程序来访问特定的配置。此流程演示了如何以 YAML 格式为特定配置集提供配置。

先决条件

  • 具有 Quarkus Maven 项目,它将配置为使用带有 JDBC 数据源驱动程序的 PostgreSQL 数据源。
  • 具有 quarkus-jdbc-postgresqlquarkus-config-yaml 扩展,作为项目的 pom.xml 文件中的依赖项。

流程

  1. 打开 src/main/resources/application.yaml 配置文件。
  2. 要设置配置集依赖的配置,请在使用 "%<profile_name>" 语法定义键值对前添加 配置集名称。确保将配置集名称放在引号内。在 YAML 中,以特殊字符开头的所有字符串都必须放在引号内。

    在以下示例中,当您以开发模式启动 Quarkus 应用程序时,PostgreSQL 数据库被配置为位于 jdbc:postgresql://localhost:5432/some-database URL 中:

    src/main/resources/application.yaml

    "%dev":
      # Properties that configure the JDBC data source driver of your PostgreSQL data source
      quarkus:
        datasource:
          url: jdbc:postgresql://localhost:5432/some-database
          driver: org.postgresql.Driver
          username: quarkus
          password: quarkus
    Copy to Clipboard Toggle word wrap

11.3. 管理配置密钥冲突

YAML 等结构化格式只支持可能配置命名空间的子集。以下流程演示了两个配置属性 quarkus.http.cors 和 quarkus.http.cors.methods 之间的冲突的解决方案,其中一个属性是另一个属性的前缀。

先决条件

  • 您已将 Quarkus 项目配置为读取 YAML 配置文件。

流程

  1. 打开 YAML 配置文件。
  2. 要将 YAML 属性定义为另一个属性的前缀,请在属性范围内添加一个 kiosk (~),如下例所示:

    quarkus:
      http:
        cors:
          ~: true
          methods: GET,PUT,POST
    Copy to Clipboard Toggle word wrap
  3. 要将 Quarkus 应用程序编译为开发模式,请从项目目录输入以下命令:

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
    注意

    您可以使用 YAML 密钥在任何级别上冲突配置密钥,因为它们没有包含在配置属性名称的汇编中。

第 12 章 更新功能测试以验证配置更改

在测试应用程序的功能前,您必须更新功能测试,以反映您对应用程序的端点所做的更改。以下流程演示了如何在 Quarkus config-quickstart 项目中更新 testHelloEndpoint 方法。

流程

  1. 打开 GreetingResourceTest.java 文件。
  2. 更新 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
        }
    
    }
    Copy to Clipboard Toggle word wrap

第 13 章 打包并运行 Quarkus 应用程序

编译 Quarkus 项目后,您可以将其打包到 JAR 文件中,并从命令行运行。

先决条件

  • 您已编译了 Quarkus 项目。

流程

  1. 要打包 Quarkus 项目,请 在根目录中 输入以下命令:

    ./mvnw clean package
    Copy to Clipboard Toggle word wrap

    此命令在 /target 目录中生成以下 JAR 文件:

    • config-quickstart-1.0-SNAPSHOT.jar :包含项目的类和资源。这是 Maven 构建生成的常规工件。
    • config-quickstart-1.0-SNAPSHOT-runner.jar: Is a executable JAR file.请注意,这个文件不是 uber-JAR 文件,因为依赖项被复制到 目标/lib 目录中。
  2. 如果开发模式正在运行,请按 CTRL+C 停止开发模式。如果没有这样做,则会出现端口冲突。
  3. 要运行应用程序,请输入以下命令:

    java -jar target/config-quickstart-1.0-SNAPSHOT-runner.jar
    Copy to Clipboard Toggle word wrap
    注意

    来自 runner JAR 文件中的 MANIFEST.MF 文件的 Class-Path 条目明确列出了 lib 目录中的 JAR 文件。如果要从其他位置部署应用程序,您必须复制 运行程序 JAR 文件和 lib 目录。

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat