Quarkus應用程序和Quarkus本身(核心和擴展)都通過相同的機制進行配置,該機制利用SmallRye Config API和 MicroProfile Config規(guī)范的實現(xiàn)。此外,Quarkus本身提供了一些附加功能洒闸。
1.配置源
默認情況下,Quarkus從多個來源(優(yōu)先級遞減)中讀取配置屬性:
- 系統(tǒng)屬性
- 環(huán)境變量
- 名為文件的文件.env放置在當前工作目錄中
- application.properties文件放在$PWD/config/目錄中
- 應用程序配置文件,即src/main/resources/application.properties
1.1.系統(tǒng)屬性
- 運行jar: java -Dquarkus.datasource.password=youshallnotpass -jar target/quarkus-app/quarkus-run.jar
- native執(zhí)行文件: ./target/myapp-runner -Dquarkus.datasource.password=youshallnotpass
1.2.環(huán)境變量
- 運行jar: export QUARKUS_DATASOURCE_PASSWORD=youshallnotpass ; java -jar target/quarkus-app/quarkus-run.jar
- native可執(zhí)行文件: export QUARKUS_DATASOURCE_PASSWORD=youshallnotpass ; ./target/myapp-runner
1.3.文件名為.env放置在當前工作目錄中
示例.env文件
QUARKUS_DATASOURCE_PASSWORD=youshallnotpass
QUARKUS_DATASOURCE_PASSWORD使用與環(huán)境變量相同的規(guī)則來轉換名稱栈雳。
對于開發(fā)人員模式,此文件可以放在項目的根目錄中缔莲,但建議不要將其檢入版本控制哥纫。
沒有定義的配置文件的環(huán)境變量.env文件將覆蓋其所有相關的配置文件中application.properties,例如痴奏,%test.application.value被覆蓋APPLICATION_VALUE的.env文件蛀骇。 |
1.4.application.properties文件放置在$PWD/config/
將application.properties文件放置在名為config的目錄中,該目錄位于應用程序運行的目錄中读拆,該文件中定義的所有運行時屬性都將覆蓋默認配置擅憔。此外,添加到該文件中的任何不屬于原始application.properties文件的 運行時屬性也將被考慮在內檐晕。對于運行程序jar和本機可執(zhí)行文件暑诸,其工作方式相同。
該config/application.properties功能在開發(fā)模式下也可用辟灰。要使用它个榕,config/application.properties需要放置在構建工具的輸出目錄中(target對于Maven和build/classes/java/mainGradle)。但是請記住芥喇,從構建工具進行的任何清理操作(例如mvn clean或)gradle clean也會刪除該config目錄笛洛。 |
1.5.應用程序配置文件
這是位于中的主要應用程序配置文件src/main/resources/application.properties。
示例application.properties文件
greeting.message=hello
quarkus.http.port=9090
- 這是用戶定義的配置屬性乃坤。
- 這是用戶定義的配置屬性苛让。
- Quarkus支持在文件中使用屬性表達式application.properties。
2.將配置文件嵌入到依賴項中
可以通過向META-INF/microprofile-config.properties配置文件中添加一個配置文件來將配置文件嵌入其中(這是MicroProfile Config的標準功能)湿诊。
當將此依賴項添加到應用程序時狱杰,其配置屬性將被合并。
可以覆蓋優(yōu)先于它的屬性來自它的屬性application.properties厅须。
3.注入配置屬性
Quarkus使用MicroProfile Config注釋在應用程序中注入配置屬性仿畸。
@ConfigProperty(name = "greeting.message")
String message;
可以使用@Inject @ConfigProperty或@ConfigProperty。對于使用@Inject注釋的成員,注釋不是必需的@ConfigProperty错沽。此行為不同于MicroProfile Config簿晓。 |
如果應用程序嘗試注入未設置的配置屬性,則會引發(fā)錯誤千埃,從而使您可以快速了解配置何時完成憔儿。 |
更多@ConfigProperty例子
@ConfigProperty(name = "greeting.message")
String message;
@ConfigProperty(name = "greeting.suffix", defaultValue="!")
String suffix;
@ConfigProperty(name = "greeting.name")
Optional<String> name;
如果您不提供此屬性的值,則應用程序啟動將失敗javax.enterprise.inject.spi.DeploymentException: No config value of type [class java.lang.String] exists for: greeting.message放可。 如果配置未提供的值谒臼,則會注入默認值greeting.suffix。 此屬性是可選的-Optional如果配置未提供的值耀里,則會注入一個空值greeting.name蜈缤。 |
4.以編程方式訪問配置
可以通過編程方式訪問配置。實現(xiàn)動態(tài)查找或從既不是CDI bean也不是JAX-RS資源的類中檢索配置的值可能很方便冯挎。
可以使用以下方式以編程方式訪問配置org.eclipse.microprofile.config.ConfigProvider.getConfig():
String databaseName = ConfigProvider.getConfig().getValue("database.name", String.class);
Optional<String> maybeDatabaseName = ConfigProvider.getConfig().getOptionalValue("database.name", String.class);
5.使用@ConfigProperties
作為以上一示例中所示的方式注入多個相關配置值的替代方法底哥,用戶還可以使用@io.quarkus.arc.config.ConfigProperties注釋將這些屬性組合在一起。
對于上面的Greeting屬性房官,GreetingConfiguration可以這樣創(chuàng)建一個類:
package org.acme.config;
import io.quarkus.arc.config.ConfigProperties;
import java.util.Optional;
@ConfigProperties(prefix = "greeting")
public class GreetingConfiguration {
private String message;
private String suffix = "!";
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;
}
}
然后可以GreetingResource使用@Inject類似的CDI注釋將此類注入到趾徽,如下所示:
@Inject
GreetingConfiguration greetingConfiguration;
Quarkus提供的另一種替代樣式是GreetingConfiguration像這樣創(chuàng)建接口:
package org.acme.config;
import io.quarkus.arc.config.ConfigProperties;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import java.util.Optional;
@ConfigProperties(prefix = "greeting")
public interface GreetingConfiguration {
@ConfigProperty(name = "message")
String message();
@ConfigProperty(defaultValue = "!")
String getSuffix();
Optional<String> getName();
}
在@ConfigProperties類或接口上使用時,如果未提供其字段之一的值易阳,則應用程序啟動將失敗附较,并且將javax.enterprise.inject.spi.DeploymentException顯示指示缺少值的信息吃粒。這不適用于Optional字段和具有默認值的字段潦俺。
5.1.有關@ConfigProperties的其他說明
當使用帶有類注釋的常規(guī)類時,@ConfigProperties不一定必須聲明getter和setter徐勃。具有簡單的公共非最終字段也是有效的事示。
此外,配置類支持嵌套對象配置僻肖。假設需要有一個額外的問候語配置層肖爵,名稱content將包含一些字段⊥卧啵可以這樣實現(xiàn):
@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;
}
}
字段名稱(不是類名稱)將確定綁定到對象的屬性的名稱劝堪。
設置屬性將以正常方式進行,例如揉稚,application.properties可能具有:
greeting.message = hello
greeting.name = quarkus
greeting.content.prize-amount=10
greeting.content.recipients=Jane,John
此外秒啦,@ConfigProperties可以使用Bean Validation批注來批注使用批注的類,類似于以下示例:
@ConfigProperties(prefix = "greeting")
public class GreetingConfiguration {
@Size(min = 20)
public String message;
public String suffix = "!";
}
為了使驗證生效搀玖,quarkus-hibernate-validator需要提供擴展名
如果使用給定的配置驗證失敗余境,則應用程序將無法啟動,并在日志中指示相應的驗證錯誤。
如果接口帶有注釋@ConfigProperties芳来,則允許該接口擴展其他接口含末,并且使用整個接口層次結構中的方法來綁定屬性。
5.2.使用具有不同前綴的相同ConfigProperty
Quarkus還支持使用注解@ConfigProperties為每個注入點使用帶有不同前綴的同一對象io.quarkus.arc.config.@ConfigPrefix即舌。舉例來說佣盒,前綴和前綴GreetingConfiguration都需要使用以上代碼。在這種情況下侥涵,代碼如下所示:greetingother
GreetingConfiguration.java
@ConfigProperties(prefix = "greeting")
public class GreetingConfiguration {
@Size(min = 20)
public String message;
public String suffix = "!";
}
SomeBean.java
@ApplicationScoped
public class SomeBean {
@Inject
GreetingConfiguration greetingConfiguration;
@ConfigPrefix("other")
GreetingConfiguration otherConfiguration;
}
5.3.使用對象列表
在某些情況下沼撕,可能有必要支持利用對象列表的復雜配置結構,如以下示例所示:
ComplexConfiguration.java
@ConfigProperties(prefix = "complex")
public class ComplexConfiguration {
public String name;
public String user;
public String password;
public List<Nested> inputs;
public List<Nested> outputs;
public static class Nested {
public String user;
public String password;
}
}
僅當將YAML配置與quarkus-config-yaml擴展一起使用時芜飘,才對此類用例提供支持务豺。相應的示例YAML配置可以是:
application.yaml
complex:
name: defaultName
user: defaultUser
password: defaultPassword
inputs:
- user: user
password: secret
- user: otheruser
password: secret2
outputs:
- user: someuser
password: asecret
- user: someotheruser
password: anothersecret
6.配置配置文件
Quarkus支持配置配置文件的概念。這些允許您在同一文件中具有多個配置嗦明,并通過配置文件名稱在它們之間進行選擇笼沥。
語法為%{profile}.config.key=value。例如娶牌,如果我有以下內容:
quarkus.http.port=9090
%dev.quarkus.http.port=8181
除非dev配置文件處于活動狀態(tài)奔浅,否則Quarkus HTTP端口將為9090 ,在這種情況下诗良,它將為8181汹桦。
要在.env文件中使用配置文件,可以遵循一種_{PROFILE}_CONFIG_KEY=value模式鉴裹。.env文件中上述示例的等效內容為:
QUARKUS_HTTP_PORT=9090
_DEV_QUARKUS_HTTP_PORT=8181
默認情況下舞骆,Quarkus具有三個配置文件,盡管可以隨意使用径荔。默認配置文件為:
- dev-在開發(fā)模式下(即quarkus:dev)激活
- 測試-運行測試時激活
- prod-未在開發(fā)或測試模式下運行時的默認配置文件
有兩種方法可以通過quarkus.profile系統(tǒng)屬性或QUARKUS_PROFILE 環(huán)境變量來設置定制概要文件督禽。如果兩者都設置,則系統(tǒng)屬性優(yōu)先总处。請注意狈惫,不必在任何地方定義這些概要文件的名稱,只需創(chuàng)建具有概要文件名稱的config屬性鹦马,然后將當前概要文件設置為該名稱即可胧谈。例如,如果我想要staging使用其他HTTP端口的配置文件荸频,則可以將以下內容添加到application.properties:
quarkus.http.port=9090
%staging.quarkus.http.port=9999
然后將QUARKUS_PROFILE環(huán)境變量設置staging為激活我的配置文件菱肖。
以編程方式檢查活動配置文件的正確方法是使用的getActiveProfile方法io.quarkus.runtime.configuration.ProfileManager。 使用@ConfigProperty("quarkus.profile")將無法正常工作试溯。 |
6.1.默認運行時配置文件
默認的Quarkus應用程序運行時配置文件設置為用于構建應用程序的配置文件蔑滓。例如:
./mvnw package -Pnative -Dquarkus.profile=prod-aws
./target/my-app-1.0-runner
該命令將與prod-aws配置文件一起運行。可以使用quarkus.profilesystem屬性來覆蓋它键袱。 |
7.使用屬性表達式
Quarkus支持在application.properties文件中使用屬性表達式燎窘。
讀取屬性后,將解析這些表達式蹄咖。因此褐健,如果您的配置屬性是構建時配置屬性,則該屬性表達式將在構建時解析澜汤。如果您的配置屬性在運行時可覆蓋蚜迅,則該屬性表達式將在運行時解析。
您可以將屬性表達式同時用于Quarkus配置或您自己的配置屬性俊抵。
屬性表達式是通過以下方式定義的:${my-property-expression}谁不。
例如,具有以下屬性:
remote.host=quarkus.io
另一個屬性定義為:
callable.url=https://${remote.host}/
將導致該callable.url屬性的值設置為:
callable.url=https://quarkus.io/
另一個示例是根據(jù)所使用的概要文件定義不同的數(shù)據(jù)庫服務器:
%dev.quarkus.datasource.jdbc.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false
quarkus.datasource.jdbc.url=jdbc:mysql://remotehost:3306/mydatabase?useSSL=false
可以通過以下方式簡化:
%dev.application.server=localhost
application.server=remotehost
quarkus.datasource.jdbc.url=jdbc:mysql://${application.server}:3306/mydatabase?useSSL=false
在此示例中徽诲,它的確增加了一行刹帕,但是的值application.server可以在其他屬性中重用,從而減少了輸入錯誤的可能性谎替,并在屬性定義中提供了更大的靈活性偷溺。
8.組合屬性表達式和環(huán)境變量
Quarkus還支持屬性表達式和環(huán)境變量的組合。
假設您在中定義了以下屬性application.properties:
remote.host=quarkus.io
您可以通過如下定義屬性來組合環(huán)境變量和屬性表達式:
application.host=${HOST:${remote.host}}
如果未設置钱贯,這將擴展HOST環(huán)境變量并將屬性的值remote.host用作默認值HOST挫掏。
出于本節(jié)的目的,我們使用了remote.host之前定義的屬性秩命。必須注意尉共,該值可以是固定值,例如:
application.host=${HOST:localhost}
localhost如果HOST未設置硫麻,它將作為默認值爸邢。
9.配置Quarkus
Quarkus本身是通過與您的應用程序相同的機制配置的樊卓。Quarkusquarkus.為自己的配置及其所有擴展的配置保留名稱空間拿愧。例如,要配置HTTP服務器端口碌尔,可以quarkus.http.port在 中設置application.properties浇辜。所有Quarkus配置屬性均已記錄且可搜索。
Quarkus在構建時進行大部分配置和引導唾戚,并且在構建期間讀取并使用了一些配置屬性柳洋。這些屬性在構建時是固定的,無法在運行時進行更改叹坦。您始終需要重新打包應用程序熊镣,以反映此類屬性的更改。
- 在構建時固定的屬性用鎖定圖標標記()在所有配置選項的列表中
但是,某些擴展程序確實定義了可以在運行時覆蓋的屬性绪囱。一個典型的例子是數(shù)據(jù)庫URL测蹲,用戶名和密碼,這些僅在您的目標環(huán)境中才知道鬼吵。這是一個權衡扣甲,因為可用的運行時屬性越多,Quarkus可以進行的構建時間越少齿椅。因此琉挖,運行時屬性列表是精簡的。您可以使用以下機制(以降低的優(yōu)先級)覆蓋這些運行時屬性:
- 系統(tǒng)屬性
- 環(huán)境變量
- 名為環(huán)境文件.env放置在當前工作目錄中
- 放置在其中的配置文件 $PWD/config/application.properties
有關更多詳細信息涣脚,請參見配置源示辈。
10.為應用程序生成配置
也可以生成一個application.properties具有所有已知配置屬性的示例,以使您輕松查看可用的Quarkus配置選項遣蚀。為此顽耳,請運行:
./mvnw quarkus:generate-config
這將創(chuàng)建一個src/main/resources/application.properties.example文件,其中包含通過您當前安裝的擴展程序公開的所有配置選項妙同。這些選項已被注釋掉射富,并在適用時具有其默認值。例如粥帚,此HTTP端口配置條目將顯示為:
#
# The HTTP port
#
#quarkus.http.port=8080
除了生成示例配置文件之外胰耗,您還可以通過設置-Dfile 參數(shù)將它們添加到實際的配置文件中:
./mvnw quarkus:generate-config -Dfile=application.properties
如果配置選項已經(jīng)存在(有注釋),則不會添加芒涡,因此在添加其他擴展名以查看添加了哪些其他選項之后可以安全地運行該配置選項柴灯。
11.清除屬性
可以通過為屬性分配一個空字符串來明確清除運行時屬性,這些屬性是可選的费尽,并具有在構建時設置的值或具有默認值赠群。請注意,這只會影響運行時屬性旱幼,并且只能與不需要其值的屬性一起使用查描。
可以通過設置相應的application.properties屬性,設置相應的系統(tǒng)屬性或設置相應的環(huán)境變量來清除該屬性柏卤。
12.自定義配置
12.1.定制配置源
您還可以采用標準MicroProfile Config方式介紹自定義配置源冬三。為此,您必須提供一個實現(xiàn)org.eclipse.microprofile.config.spi.ConfigSource 或的類org.eclipse.microprofile.config.spi.ConfigSourceProvider缘缚。為該類創(chuàng)建一個 服務文件勾笆,它將在應用程序啟動時檢測并安裝。
12.2.定制配置轉換器
您也可以將自定義類型用于配置值桥滨。這可以通過org.eclipse.microprofile.config.spi.Converter<T> 在META-INF/services/org.eclipse.microprofile.config.spi.Converter文件中實現(xiàn)并添加其完全限定的類名來完成窝爪。
讓我們假設您有一個像這樣的自定義類型:
package org.acme.config;
public class MicroProfileCustomValue {
private final int number;
public MicroProfileCustomValue(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
}
相應的轉換器如下所示弛车。請注意,您的自定義轉換器類必須是public并且必須具有public無參數(shù)構造函數(shù)蒲每。也一定不能abstract帅韧。
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.parseInt(value));
}
}
然后,您需要在服務文件中包含轉換器的標準類名META-INF/services/org.eclipse.microprofile.config.spi.Converter啃勉。如果您有更多的轉換器忽舟,也只需在其文件中添加它們的類名。每行一個全限定的類名淮阐,例如:
org.acme.config.MicroProfileCustomValueConverter
org.acme.config.SomeOtherConverter
org.acme.config.YetAnotherConverter
請注意叮阅,SomeOtherConverter并且YetAnotherConverter僅出于演示目的而添加了。如果在此文件中包含在運行時不可用的類泣特,則轉換器加載將失敗浩姥。
完成此操作后,您可以將自定義類型用作配置值:
@ConfigProperty(name = "configuration.value.name")
MicroProfileCustomValue value;
12.2.1.轉換器優(yōu)先級
在某些情況下状您,您可能希望使用自定義轉換器來轉換已經(jīng)由其他轉換器轉換的類型勒叠。在這種情況下,您可以使用javax.annotation.Priority注釋來更改轉換器的優(yōu)先級膏孟,并使自定義轉換器的優(yōu)先級高于列表中的其他轉換器眯分。
默認情況下,如果@Priority在轉換器上找不到No 柒桑,則其優(yōu)先級為100弊决,所有Quarkus核心轉換器的優(yōu)先級為200,因此魁淳,根據(jù)要替換的轉換器飘诗,需要設置更高的值。
為了演示這個想法界逛,讓我們實現(xiàn)一個自定義轉換器昆稿,該轉換器將優(yōu)先MicroProfileCustomValueConverter于上一個示例中實現(xiàn)的轉換器 。
package org.acme.config;
import javax.annotation.Priority;
import org.eclipse.microprofile.config.spi.Converter;
@Priority(150)
public class MyCustomConverter implements Converter<MicroProfileCustomValue> {
@Override
public MicroProfileCustomValue convert(String value) {
final int secretNumber;
if (value.startsFrom("OBF:")) {
secretNumber = Integer.parseInt(SecretDecoder.decode(value));
} else {
secretNumber = Integer.parseInt(value);
}
return new MicroProfileCustomValue(secretNumber);
}
}
由于它會轉換相同的值類型(即MicroProfileCustomValue)息拜,并且優(yōu)先級為150溉潭,因此將使用MicroProfileCustomValueConverter默認優(yōu)先級為100的a代替它。
此新轉換器還需要在服務文件中列出该溯,即META-INF/services/org.eclipse.microprofile.config.spi.Converter岛抄。 |
13. YAML配置
13.1.添加YAML配置支持
您可能要對屬性使用YAML進行配置别惦。由于SmallRye Config帶來了對YAML配置的支持狈茉,因此Quarkus也支持這一點。
首先掸掸,您需要將Config YAML擴展名添加到您的pom.xml:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-config-yaml</artifactId>
</dependency>
或者氯庆,您也可以在包含Quarkus項目的目錄中運行以下命令:
./mvnw quarkus:add-extension -Dextensions="config-yaml"
現(xiàn)在蹭秋,Quarkus可以讀取YAML配置文件。配置目錄和優(yōu)先級與以前相同堤撵。
Quarkus將選擇application.yaml一個application.properties仁讨。YAML文件只是配置應用程序的另一種方法。您應該確定并保留一種配置類型实昨,以避免出現(xiàn)錯誤洞豁。 |
13.1.1.配置實例
# YAML supports comments
quarkus:
datasource:
db-kind: postgresql
jdbc:
url: jdbc:postgresql://localhost:5432/some-database
username: quarkus
password: quarkus
# REST Client configuration property
org:
acme:
restclient:
CountriesService/mp-rest/url: https://restcountries.eu/rest
# For configuration property names that use quotes, do not split the string inside the quotes.
quarkus:
log:
category:
"io.quarkus.category":
level: INFO
Quarkus還支持使用application.yml作為YAML文件的名稱。該文件與的規(guī)則相同application.yaml荒给。 |
13.2.取決于配置文件的配置
與屬性一樣丈挟,通過YAML提供與配置文件相關的配置也是如此。%profile在定義鍵/值對之前志电,只需添加包裝在引號中的引號即可:
"%dev":
quarkus:
datasource:
db-kind: postgresql
jdbc:
url: jdbc:postgresql://localhost:5432/some-database
username: quarkus
password: quarkus
13.3.配置密鑰沖突
MicroProfile Config規(guī)范將配置鍵定義為一個任意的曙咽,.分隔字符串。但是挑辆,像YAML這樣的結構化格式天真的僅支持可能的配置名稱空間的子集例朱。例如,考慮兩個配置屬性quarkus.http.cors和quarkus.http.cors.methods鱼蝉。一個屬性是另一個屬性的前綴洒嗤,因此如何在您的YAML配置中同時指定兩個密鑰可能并不明顯。
這可以通過對任何YAML屬性使用null鍵(通常由表示~)來解決魁亦,該鍵是另一個前綴烁竭。這是一個例子:
解決與前綴相關的鍵名沖突的示例YAML配置
quarkus:
http:
cors:
~: true
methods: GET,PUT,POST
通常,nullYAML密鑰不包括在配置屬性名稱的匯編中吉挣,從而允許它們在任何級別上用于消除配置密鑰的歧義派撕。
14.有關如何配置的更多信息
Quarkus依賴SmallRye Config并繼承其功能。
SmallRye Config提供:
- 其他配置源
- 附加轉換器
- 索引屬性
- 家長資料
- 用于配置值解析的攔截器
- 重新定位配置屬性
- 后備配置屬性
- 記錄中
- 隱藏秘密