The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.
このページを編集

設定リファレンスガイド

本ガイドの内容を改訂し、さらにトピックを分割しました。追加情報をご覧ください。

このリファレンスガイドでは、Quarkus の設定の様々な側面について説明します。Quarkus アプリケーションと Quarkus 自体 (コアとエクステンション) の両方は、 MicroProfile Config 仕様の実装である SmallRye Config APIを活用した同じメカニズムを介して設定されます。

Quarkus エクステンションを設定可能にする方法については、独自のエクステンションの作成 ガイドを参照してください。

1. 設定ソース

デフォルトでは、Quarkus は複数のソースから設定プロパティーを読み取ります (降順)。

  1. (400) システムプロパティー

  2. (300) 環境変数

  3. (295) 現在の作業ディレクトリーの .env ファイル

  4. (260) $PWD/config/application.propertiesQuarkus アプリケーション設定ファイル

  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 は、指定されたプロパティ名に対して 3 つの環境変数を検索します (例: foo.BAR.baz ):

  • foo.BAR.baz - 完全一致

  • foo_BAR_baz - 英数字でもなく、 でもない各文字を、 で置換

  • FOO_BAR_BAZ - 英数字でも でもない各文字を で置換。その後、名前を大文字に変換

SmallRye Configでは、 追加の変換ルール を指定しています。

  • 二重引用符で囲まれたプロパティ foo."bar".baz の場合、英数字でも でもない各文字を で置換します: FOOBARBAZ

  • ダッシュを含むプロパティ 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.urlQUARKUS_DATASOURCEDATASOURCE_NAMEJDBC_URL になります。 設定システムで両方のプロパティが利用可能であれば、設定は期待通りに動作します。

QUARKUS_DATASOURCEDATASOURCE_NAMEJDBC_URL のみが存在する場合、Config システムは設定名を最も可能性の高いドット形式に再変換する必要があります。これは固定コンフィギュレーションセグメントに対しては問題なく機能しますが、ダイナミックセグメントを含む名前に対しては機能しません。この場合、Quarkusは DATASOURCE_NAMEdatasource.namedatasource-name (またはその他の特殊文字区切り)に変換すべきかどうかを判断できません。

このため、このようなプロパティは、環境変数名を曖昧にしないために、別のソースでのドット付きバージョン名(値は空のままでもかまいません)を常に必要とします。これは、双方向変換を実行し、プロパティ名を一致させるための追加情報を提供します。

# value can be left empty
quarkus.datasource."datasource-name".jdbc.url=
EXPORT QUARKUS_DATASOURCE__DATASOURCE_NAME__JDBC_URL=jdbc:postgresql://localhost: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.propertiesdev モードでも利用可能です。ファイルは、ビルドツールの出力ディレクトリー (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. Locations

Additionally to the default config locations, Quarkus provides a way to scan additional locations for configuration properties files.

The quarkus.config.locations configuration property accepts multiple locations separated by a comma , and each must represent a valid URI. The supported URI schemes are:

  • file or directory (file:)

  • classpath resource

  • jar resource (jar:)

  • http resource (http:)

All loaded sources use the same ordinal of the source that found the quarkus.config.locations configuration property. For instance, if quarkus.config.locations is set as a system property, then all loaded sources have their ordinals set to 400 (system properties use 400 as their ordinal). The ordinal may be overridden directly for each config source by setting the config_ordinal property and the ordinal value. The config_ordinal property only affects the ordinal of the source in which is being set. Sources are sorted first by their ordinal, then by location order, and finally by loading order.

1.7. その他の設定ソース

Quarkus は、他の設定フォーマットとストアをカバーする追加のエクステンションを提供します。

カスタム Config Source を作成することもできます。

2. Inject

Quarkus では、 MicroProfile Config アノテーションを使用して、アプリケーションに設定プロパティーを注入しています。

@ConfigProperty(name = "greeting.message") (1)
String message;
1 @Inject @ConfigProperty を使用することも、 @ConfigProperty だけを使用することもできます。 @Inject アノテーションは、 @ConfigProperty でアノテーションされたメンバーには必要ありません。
アプリケーションが設定されていない設定プロパティーを注入しようとすると、エラーがスローされます。
@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 が注入されます。
Config Mappings を使用して、同様の設定プロパティーをグループ化します。

2.1. デフォルト値

プロパティが( defaultValue 属性によって)デフォルト値と関連付けられ、そのプロパティに対して設定値が設定されない場合、 jakarta.enterprise.inject.spi.DeploymentException を投げるのではなく、デフォルト値が使用されます。 defaultValue 値は String として表現され、設定値の処理に使用されるのと同じ変換機構が使用されます。プリミティブ、ボックス化されたプリミティブ、その他のクラスには、すでにいくつかの組み込みコンバーターが存在します。例:

  • プリミティブ: booleanbyteshort など

  • ボックス化されたプリミティブ: java.lang.Booleanjava.lang.Bytejava.lang.Short など

  • オプションのコンテナー: java.util.Optionaljava.util.OptionalIntjava.util.OptionalLong、および java.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 として解釈される

  • float 型および double 型の値の場合、小数桁はドット . で区切る必要がある

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 は 3 つのプロファイルを提供し、特定の条件で自動的にアクティブになります。

  • dev - 開発モードのときに有効 (つまり quarkus:dev)

  • test - テストを実行しているときに有効

  • prod - 開発モードまたはテストモード以外で使用されるデフォルトプロファイル

4.3. カスタムプロファイル

追加のプロファイルを作成し、quarkus.profile 設定プロパティーを使用してそれらをアクティブ化することもできます。新しいプロファイル名を持つ単一の設定プロパティーが唯一の要件です。

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

quarkus.profilestaging に設定すると、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

このスタイルでは、プロファイル対応ファイルの設定名の前にプロファイル名を付ける必要はありません。

プロファイル対応ファイルのプロパティーは、メインファイルで定義されているプロファイル対応プロパティーよりも優先されます。

Do not use profile aware files to set quarkus.profile or quarkus.test.profile. This will not work because the profile is required in advance to load the profile aware files.

A profile aware file is only loaded if the unprofiled application.properties is also available in the same location and the file extension matches between the files. This is required to keep a consistent loading order and pair all the resources together.

4.5. 親プロファイル

親プロファイルは、現在のプロファイルに 1 レベルの階層を追加します。設定 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 はどちらも別のプロファイルです。

複数のプロファイルが有効な場合、プロファイル設定に関するルールは同じです。2つのプロファイルが同じ設定を定義している場合、最後にリストされたプロファイルが優先されます。と考えてください:

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です。

Multiple profiles priority work in reverse order. With quarkus.profile=common,dev, Quarkus first checks the dev profile and then the common profile.

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.io/ です。

別の例としては、プロファイルで異なるデータベースサーバーを定義できます。

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

次のように簡略化できます。

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} と表現することができます。 handler は、 value を解読または復号するための io.smallrye.config.SecretKeysHandler の名前です :

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 を読み出すと、 aes-gcm-nopadding という名前の SecretKeysHandler を使って、値 DJNrZ6LfpupFv6QbXyXhvzD8eVDnDa_kTliQBpuzTobDZxlg がデコードされます。

詳しくは、SmallRye Config Secret Keys のドキュメントをご確認ください。

SmallRye Configは、Quarkusが完全にサポートしていないハンドラを提供する場合があります。現在のところ、 smallrye-config-crypto のみがサポートされています。

7. 生成中の UUID へのアクセス

Quarkus のデフォルトの設定ソースはランダムな UUID 値を提供します。起動時に UUID を生成します。そのため、開発モードでのリロードを含め、スタートアップ間で値が変化します。

You can access the generated value using the quarkus.uuid property. Use expressions to access it: ${quarkus.uuid}. For example, it can be useful to configure a Kafka client with a unique consumer group:

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) を呼び出すと、値 dogcat、および turtle が含まれる List<String> が自動的に作成および変換されます。Config#getValues("my.indexed.collection", String.class) を呼び出すと、まったく同じ結果が返されます。同じプロパティー名が両方の形式 (通常およびインデックス付き) に存在する場合、通常の値が優先されます。

インデックス付きのプロパティーは、ターゲットの Collection に追加される前に、インデックスで並べ替えられます。インデックスに含まれるギャップはターゲットの Collection に解決されません。つまり、Collection の結果にはギャップのないすべての値が格納されます。

10. Quarkus の設定

Quarkus自体は、アプリケーションと同じメカニズムで設定されます。Quarkusは、自身の設定のために quarkus. 名前空間を予約します。例えば、HTTPサーバーポートを設定するには、 quarkus.http.portapplication.properties に設定します。Quarkusのすべての設定プロパティは 文書化されており、検索可能です。

上述したように、 quarkus. で始まるプロパティーは、Quarkus 自体を設定するために実質的に予約されているため、アプリケーション固有のプロパティーのプレフィックスとして quarkus. を使用してはいけ ません

10.1. ビルド時設定

Some Quarkus configurations only take effect during build time, meaning it is not possible to change them at runtime. These configurations are still available at runtime but as read-only and have no effect in Quarkus behaviour. A change to any of these configurations requires a rebuild of the application itself to reflect changes of such properties.

ビルド時に固定されたプロパティーは、 すべての設定オプションのリスト でロックアイコン () でマークされます。

しかし、いくつかのエクステンションは 実行時にオーバーライド可能な プロパティーを定義しています。定型的な例としては、データベースの URL、ユーザー名とパスワードがあります。これはターゲット環境によって定まるものであり、実行時にセットされ、アプリケーションの動作に影響を与えるものです。

11. アプリケーションが公開された後、ビルド時のプロパティー変更

アプリケーションのビルド後にビルド時の設定を変更する必要があるというまれな状況にある場合は、再オーグメンテーション を使用して、別のビルド時設定のオーグメンテーション出力を再ビルドする方法を確認してください。

12. ビルド時に使用される有効なビルド時設定の追跡

設定ソースは通常、ビルド中に実際に使用されるよりも多くのオプションを提供するため、Quarkusのビルドプロセスで実際に使用された設定オプションを知ることは有益です。

12.1. ビルド中に読み込まれたビルド時設定オプションのダンプ

quarkus.config-tracking.enabledtrue に設定すると、設定インターセプターが有効になり、ビルドプロセス中に読み込まれたすべての設定オプションを、その値とともに記録します。結果のレポートはデフォルトで ${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 の値にも優先します。

The prod part of the quarkus-prod-config-dump file name refers to the Quarkus build mode, indicating that the dump was taken for the production build.

The reason ${project.basedir}/.quarkus directory was chosen as the default location was to make it easy to track build time configuration changes between builds and use that as an indicator to build output caching tools (such as Apache Maven Build Cache and Develocity Build Cache) whether the application binary has to be re-built.

12.1.1. 設定オプションのフィルタリング

Configuration tracker could be instructed to exclude some of the options from the report by configuring quarkus.config-tracking.exclude with a comma-separated list of configuration option names that should be filtered out.

12.1.2. パス値

Configuration options with absolute path values that begin with a user home directory are, by default, transformed with Unix home directory alias '~' replacing the user home directory part and using / as a path element separator.

この変換は、 quarkus.config-tracking.use-user-home-alias-in-pathsfalse に設定することで無効にできます。

12.1.3. 記録された設定値のハッシュ化

Configuration values can be hashed using SHA-512 algorithm before they are written to a file. Configuration option names whose values should be hashed can be configured in quarkus.config-tracking.hash-options as a comma separated list.

12.2. ビルド間のビルド時設定の変化の追跡

While quarkus.config-tracking.enabled enables effective build time configuration report generation, there is also a way to check whether the values stored in that report have changed before the next build of the project is launched.

Maven projects could add the following goal to their quarkus-maven-plugin configuration:

      <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 -->

The track-config-changes goal looks for ${project.basedir}/.quarkus/quarkus-prod-config-dump (file name and directory are configurable) and, if the file already exists, checks whether the values stored in the config dump have changed. It will log the changed options and save the current values of each of the options present in ${project.basedir}/.quarkus/quarkus-prod-config-dump in ${project.basedir}/target/quarkus-prod-config.check (the target file name and location can be configured). If the build time configuration has not changed since the last build both ${project.basedir}/.quarkus/quarkus-prod-config-dump and ${project.basedir}/.quarkus/quarkus-prod-config-dump will be identical.

12.2.1. Dump Quarkus application dependencies

In addition to dumping configuration values, track-config-changes goal also dumps all the Quarkus application dependencies, including Quarkus build time dependencies. This file could be used to check whether Quarkus build classpath has changed since the previous run, for instance together with Develocity’s ability to checksum a classpath. By default, the list of dependencies will be stored under target/quarkus-prod-dependencies.txt file. A different location could be configured using plugin parameters.

12.2.2. 記録された設定が見つからない場合、現在のビルド時設定をダンプする

デフォルトでは、 track-config-changes は前回のビルド時に記録された設定を探し、見つからなければ何もしない。 dumpCurrentWhenRecordedUnavailable パラメータを有効にすると、 quarkus.config-tracking.* の設定を考慮して、現在のビルド設定オプションをダンプします。

Unlike the build configuration options recorded during the quarkus:build goal, configuration options saved by quarkus:track-config-changes with dumpCurrentWhenRecordedUnavailable enabled will include all the build configuration options exposed by a org.eclipse.microprofile.config.Config instance. Which means this report may include some build configuration options that will not be used by the Quarkus application build process but also may be missing some build configuration options since MicroProfile Config specification allows configuration sources not to expose all the property names they provide to users.

13. 静的初期化フェーズで注入される設定プロパティ値

Quarkus collects the config property values injected in CDI beans during static initialization phase. The collected values are then compared with their runtime initialization counterparts and if a mismatch is detected the application startup fails. How can it happen? For example, let’s have a CDI bean org.acme.MyBean. MyBean injects a @ConfigProperty of name foo and is initialized during the native build. The config property does not exist during the native build and so the default value bar is used. But later, when the application is started the property is defined with a system property: -Dfoo=baz. This would lead to inconsistent state and unexpected behavior. Therefore, Quarkus would fail in this situation by default.

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. 設定リファレンス

ビルド時に固定される構成プロパティ - 他のすべての構成プロパティは実行時にオーバーライド可能

Configuration property

タイプ

デフォルト

A comma separated list of profiles that will be active when Quarkus launches.

Environment variable: QUARKUS_PROFILE

Show more

list of string

Accepts a single configuration profile name. If a configuration property cannot be found in the current active profile, the config performs the same lookup in the profile set by this configuration.

Environment variable: QUARKUS_CONFIG_PROFILE_PARENT

Show more

string

Additional config locations to be loaded with the Config. The configuration support multiple locations separated by a comma and each must represent a valid java.net.URI.

Environment variable: QUARKUS_CONFIG_LOCATIONS

Show more

list of URI

Validates that a @ConfigMapping maps every available configuration name contained in the mapping prefix.

Environment variable: QUARKUS_CONFIG_MAPPING_VALIDATE_UNKNOWN

Show more

ブーリアン

Enable logging of configuration values lookup in DEBUG log level.
The log of configuration values require the category set to DEBUG in the io.smallrye.config category: quarkus.log.category."io.smallrye.config".level=DEBUG.

Environment variable: QUARKUS_CONFIG_LOG_VALUES

Show more

ブーリアン

A property that allows accessing a generated UUID. It generates that UUID at startup time. So it changes between two starts including in dev mode.
Access this generated UUID using expressions: ${quarkus.uuid}.

Environment variable: QUARKUS_UUID

Show more

string

関連コンテンツ