設定リファレンスガイド
このリファレンスガイドでは、Quarkus の設定の様々な側面について説明します。Quarkus アプリケーションと Quarkus 自体 (コアとエクステンション) の両方は、 MicroProfile Config 仕様の実装である SmallRye Config APIを活用した同じメカニズムを介して設定されます。
Quarkus エクステンションを設定可能にする方法については、独自のエクステンションの作成 ガイドを参照してください。 |
1. 設定ソース
デフォルトでは、Quarkus は複数のソースから設定プロパティーを読み取ります (降順)。
-
(400) システムプロパティー
-
(300) 環境変数
-
(295) 現在の作業ディレクトリーの .env ファイル
-
(260)
$PWD/config/application.properties
の Quarkus アプリケーション設定ファイル -
(250) クラスパスの Quarkus アプリケーション設定ファイル
application.properties
-
(100) クラスパスの MicroProfile Config 設定ファイル
META-INF/microprofile-config.properties
最終的な設定は、これらすべてのソースによって定義されたプロパティーの集約です。設定プロパティーのルックアップは、使用可能な最も高い序数の設定ソースから始まり、一致するものが見つかるまで他のソースに下がっていきます。つまり、上位の序数設定ソースに別の値を設定するだけで、設定プロパティーが値をオーバーライドする可能性があります。たとえば、環境プロパティーを使用して設定されたプロパティーは、 application.properties
ファイルを使用して提供された値をオーバーライドします。

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
状況によ っ ては、 正確なプ ロ パテ ィ 名を検索す る こ と が不可能な場合 も あ り ます。これは、ユーザー定義のパスセグメントを含む設定名の場合です。 環境変数名の変換ルールを適用すると、
このため、このようなプロパティは常に、環境変数名を曖昧にしないために、別のソースでのドット付きバージョン名を必要とします。 これは、双方向変換を実行し、プロパティ名を一緒に一致させるための追加情報を提供します。
|
1.3. 現在の作業ディレクトリーにある .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.properties
、 src/test/resources/application.properties
) から、または application.properties
エントリーが含まれる jar
依存関係から読み込まれます。見つかった各 application.properties
は個別の ConfigSource
として扱われ、他のすべてのソースと同じルールに従います (プロパティーごとのオーバーライド)。さらに、設定ファイルは $PWD/config/application.properties
に存在する場合もあります。読み込みは config フォルダーから始まり、次にクラスパスの順序になります (アプリケーションソース内の application.properties
ファイルがクラスローダー読み込み順序で優先されます)。
application.properties
greeting.message=hello (1)
quarkus.http.port=9090 (2)
1 | これは、ユーザー定義の設定プロパティーです。 |
2 | これは quarkus-vertx-http エクステンションによって消費される設定プロパティーです。 |
config/application.properties は dev モードでも利用可能です。ファイルは、ビルドツールの出力ディレクトリー (Maven の場合は target 、Gradle の場合は build/classes/java/main ) の中に置く必要があります。ただし、 mvn clean や gradle clean のようなビルドツールからのクリーンアップ操作は、 config ディレクトリーも削除してしまうことに注意してください。
|
1.5. MicroProfile Config 設定ファイル
src/main/resources/META-INF/microprofile-config.properties
にある MicroProfile Config 設定ファイル。
microprofile-config.properties
greeting.message=hello (1)
quarkus.http.port=9090 (2)
1 | これは、ユーザー定義の設定プロパティーです。 |
2 | これは quarkus-vertx-http エクステンションによって消費される設定プロパティーです。 |
これは、Quarkus アプリケーション設定ファイル application.properties とまったく同じように機能します。Quarkus の application.properties を使用することをお勧めします。
|
1.6. ロケーション
Quarkus は、設定プロパティーファイルをデフォルトの設定場所だけでなく、別の場所でもスキャンするための方法を提供します。
quarkus.config.locations
設定プロパティーは、コンマ ,
で区切られた複数の場所を受け入れます。
場所は、それぞれ有効な URI
を表す必要があります。サポートされている URI
スキームは次のとおりです。
-
ファイルまたはディレクトリー (
file:
) -
クラスパスリソース
-
jar リソース (
jar:
) -
http リソース (
http:
)
読み込まれたすべてのソースは、 quarkus.config.locations
設定プロパティーを見つけたソースと同じ序数を使用します。たとえば、 quarkus.config.locations
がシステムプロパティーとして設定されている場合、ロードされたすべてのソースの序数は 400
に設定されています (システムプロパティーは序数として 400
を使用します)。序数は、 config_ordinal
と序数値を設定することで、設定ソースごとに直接オーバーライドできます。 config_ordinal
プロパティーは、設定されているソースの序数にのみ影響します。ソースは、まず序数でソートされ、次に場所の順序、最後に読み込み順序でソートされます。
2. ConfigMapping
The recommended way to expose configuration to a Quarkus application is by mapping it with an interface. With SmallRye Config Mappings, it is possible to group multiple configuration properties in a single interface that share the same prefix (or namespace). It supports the following set of features:
-
Automatic conversion of the configuration type, including List, Set, Map, Optional, and primitive types.
-
Nested Config Mapping groups.
-
Configuration Properties Naming Strategies
-
Integration with Bean Validation
A Config Mapping requires an interface with minimal metadata configuration annotated with
@io.smallrye.config.ConfigMapping
:
@ConfigMapping(prefix = "server")
public interface Server {
String host();
int port();
int sslPort();
}
A complex object type uses the following rules to map configuration values to their member values:
-
A configuration path is built by taking the object type prefix (or namespace) and the mapping member name
-
The member name is converted to its kebab-case format
-
If the member name is represented as a getter, the member name is taken from its property name equivalent, and then converted to its kebab-case format.
-
The configuration value is automatically converted to the member type
-
The configuration path is required to exist with a valid configuration value or the mapping will fail.
Kebab-case - the method name is derived by replacing case changes with a dash to map the configuration property. |
The Server
interface can map configuration properties with the name server.host
into the Server.host()
method, server.port
into Server.port()
method, and server.ssl-port
into Server.sslPort()
method. The
configuration property name to look up is constructed from the prefix and the method name (in kebab-case), separated
by adot (.
) character.
A @ConfigMapping
can be injected into any CDI aware bean:
@ApplicationScoped
class BusinessBean {
@Inject
Server server;
void businessMethod() {
String host = server.host();
}
}
For non-CDI components, use the io.smallrye.config.SmallRyeConfig#getConfigMapping
API to retrieve the config mapping
instance:
SmallRyeConfig config = ConfigProvider.getConfig().unwrap(SmallRyeConfig.class);
Server server = config.getConfigMapping(Server.class);
Check the Mapping configuration to objects guide for advanced usages with
@ConfigMapping .
|
3. ConfigProperty
While @ConfigMapping
is the recommended approach, Quarkus also supports
MicroProfile Config annotations to inject the
configuration properties in the application.
@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 | If you do not provide a value for this property, the application startup fails with
io.quarkus.runtime.configuration.ConfigurationException: Failed to load config value of type class java.lang.String for: greeting.messagee . |
2 | デフォルト値は、設定が greeting.suffix の値を提供していない場合に注入されます。 |
3 | このプロパティーはオプションです - 設定が greeting.name の値を提供していない場合は、空の Optional が注入されます。 |
Config Mappings を使用して、同様の設定プロパティーをグループ化します。 |
4. デフォルト値
If a configuration is associated with a default value (by way of the io.smallrye.config.WithDefault
or
org.eclipse.microprofile.config.inject.ConfigProperty.defaultValue
), and no configuration value is supplied for the
property, then rather than throwing an exception, the default value will be used. A default value is expressed as a
String
, and uses the same conversion mechanism used to process configuration values. Several Built-in Converters
already exist for primitives, boxed primitives, and other classes; for example:
-
プリミティブ:
boolean
、byte
、short
など -
ボックス化されたプリミティブ:
java.lang.Boolean
、java.lang.Byte
、java.lang.Short
など -
オプションのコンテナー:
java.util.Optional
、java.util.OptionalInt
、java.util.OptionalLong
、およびjava.util.OptionalDouble
-
Java
enum
タイプ -
JSR 310
java.time.Duration
-
JDK ネットワーキング
java.net.SocketAddress
、java.net.InetAddress
など
ご想像のとおり、これらのコンバーターは org.eclipse.microprofile.config.spi.Converter
の実装です。したがって、これらのコンバーターは、次のような Microprofile またはカスタム実装プロバイダーの式ルールに準拠しています。
-
"true"、"1"、"YES"、"Y"、"ON" の場合、ブール値は
true
になる。それ以外の場合、値は false として解釈される -
float 型および double 型の値の場合、小数桁はドット
.
で区切る必要がある
Note that when a combination of Optional*
types and defaults are used, the defined default value will still be used
and if no value is given for the property, the Optional*
will be present and populated with the converted default
value. However, when the property is explicitly empty, the default value is not used and the Optional
will be empty.
Consider this example:
# 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
が発生し、デフォルト値は割り当てられません。
5. プログラムでアクセス
The io.smallrye.config.SmallRyeConfig
API allows to access the Config API programmatically.
This API is mostly useful in situations where CDI injection is not available.
SmallRyeConfig config = org.eclipse.microprofile.config.ConfigProvider.getConfig().unwrap(SmallRyeConfig.class);
String databaseName = config.getValue("database.name", String.class);
Optional<String> maybeDatabaseName = config.getOptionalValue("database.name", String.class);
設定値を取得するために System.getProperty(String) または System.getEnv(String) を使用しないでください。これらの API は設定に対応しておらず、このガイドで説明されている機能をサポートしていません。
|
6. プロファイル
私たちはしばしば、ターゲット 環境 に応じてアプリケーションを異なるように設定する必要があります。たとえば、ローカルの開発環境と本番環境は異なるかもしれません。
設定プロファイルでは、同じファイルまたは個別のファイルで複数の設定を行い、プロファイル名を使用してそれらから選択できます。
6.1. プロパティー名のプロファイル
同じ名前のプロパティーを設定できるようにするには、各プロパティーは、 %{profile-name}.config.name
の構文で、プロファイル名とドット .
の前にパーセント記号 %
を付ける必要があります。
quarkus.http.port=9090
%dev.quarkus.http.port=8181
Quarkus HTTP ポートは 9090 になります。 dev
プロファイルがアクティブな場合、8181 になります。
.env
ファイルのプロファイルは構文 _{PROFILE}_CONFIG_KEY=value
に従います。
QUARKUS_HTTP_PORT=9090
_DEV_QUARKUS_HTTP_PORT=8181
プロファイルが特定の属性の値を定義していない場合、デフォルト (プロファイルなし) の値が使用されます。
bar=”hello”
baz=”bonjour”
%dev.bar=”hallo”
dev
プロファイルを有効にすると、プロパティー bar
の値は hallo
になりますが、プロパティー baz
の値は bonjour
になります。 prod
プロファイルが有効になっている場合、 bar
の値は hello
(` prod` プロファイルには特定の値がないため) であり、 baz
の値は bonjour
です。
6.2. デフォルトのプロファイル
デフォルトでは、Quarkus は 3 つのプロファイルを提供し、特定の条件で自動的にアクティブになります。
-
dev - 開発モードのときに有効 (つまり
quarkus:dev
) -
test - テストを実行しているときに有効
-
prod - 開発モードまたはテストモード以外で使用されるデフォルトプロファイル
6.3. カスタムプロファイル
追加のプロファイルを作成し、 quarkus.profile
設定プロパティーを使用してそれらをアクティブ化することもできます。新しいプロファイル名を持つ単一の設定プロパティーが唯一の要件です。
quarkus.http.port=9090
%staging.quarkus.http.port=9999
quarkus.profile
を staging
に設定すると、 staging
プロファイルがアクティブになります。
The |
6.4. プロファイル対応ファイル
この場合、特定のプロファイルのプロパティは、 application-{profile}.properties
という名前のファイルに格納されます。先ほどの例は次のように表現できます。
quarkus.http.port=9090
%staging.quarkus.http.test-port=9091
quarkus.http.port=9190
quarkus.http.test-port=9191
このスタイルでは、プロファイル対応ファイルの設定名の前にプロファイル名を付ける必要はありません。 プロファイル対応ファイル内のプロパティーは、メインファイルで定義されているプロファイル対応プロパティーよりも優先されます。 |
|
ファイルを設定に含めて一貫した順序でロードするためには、 |
6.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 です
|
6.6. 複数のプロファイル
複数のプロファイルを同時にアクティブにすることができます。 quarkus.profile
設定では、カンマで区切られたプロファイル名のリストを受け付けます: quarkus.profile=common,dev
。 common
と dev
はどちらも別のプロファイルです。
複数のプロファイルが有効な場合、プロファイル設定に関するルールは同じです。2つのプロファイルが同じ設定を定義している場合、最後にリストされたプロファイルが優先されます。と考えてください:
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
また、プロファイル名をカンマで区切って、複数のプロファイルプロパティを定義することも可能です。同じプロパティ名が複数のプロファイルプロパティに存在する場合、最も具体的なプロファイルを持つプロパティ名が優先されます:
quarkus.profile=dev
%prod,dev.my.prop=1234
%dev.my.prop=5678
%prod,dev.another.prop=1234
この場合、
-
my.prop
の値は5678です。 -
another.prop
の値は1234です。
複数のプロファイルの優先順位は逆順で動作します。 |
7. プロパティー式
Quarkus は、設定値のプロパティー式拡張を提供します。式文字列は、プレーン文字列と式セグメントの組み合わせであり、シーケンス ${ … }
でラップされます。
これらの式は、プロパティーの読み込み時に解決されます。したがって、設定プロパティーがビルド時である場合、プロパティー式はビルド時に解決されます。設定プロパティーが実行時にオーバーライド可能になると、実行時に解決されます。
以下だとすると、
remote.host=quarkus.io
callable.url=https://${remote.host}/
callable.url
プロパティーの解決された値は https://quarkus.io/
です。
別の例としては、プロファイルで異なるデータベースサーバーを定義できます。
%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
さらに、式拡張エンジンは次のセグメントをサポートします。
-
${expression:value}
- 拡張で値が見つからない場合、:
の後にデフォルト値を提供します。 -
${my.prop${compose}}
- 構成された式。内部式が最初に解決されます。 -
${my.prop}${my.prop}
- 複数の式。
式を展開できず、デフォルトが指定されていない場合、 NoSuchElementException
が出力されます。
式のルックアップは、すべての設定ソースで実行されます。式の値と展開値は、異なる設定ソースに存在する場合があります。 |
8. シークレット・キー式
シークレット設定は、 ${handler::value}
と表現することができます。 handler
は、 value
を解読または復号するための io.smallrye.config.SecretKeysHandler
の名前です :
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が完全にサポートしていないハンドラを提供する場合があります。現在のところ、 |
9. 生成中の UUID へのアクセス
Quarkus のデフォルトの設定ソースはランダムな UUID 値を提供します。起動時に UUID を生成します。そのため、開発モードでのリロードを含め、スタートアップ間で値が変化します。
生成された値には、 quarkus.uuid
プロパティーを使用してアクセスできます。アクセスするには、expressions を使用します (${quarkus.uuid}
)。たとえば、一意のコンシューマーグループを使用して Kafka クライアントを設定する場合に便利です。
mp.messaging.incoming.prices.group.id=${quarkus.uuid}
10. プロパティーの削除
任意であり、ビルド時に値が設定されていたり、デフォルト値が設定されていたりする実行時プロパティーは、空の文字列をプロパティーに代入することで明示的に削除することができます。これは実行時プロパティーに のみ 影響し、値が必須ではないプロパティーで のみ 動作することに注意してください。
remote.host=quarkus.io
-Dremote.host=
を指定して remote.host
を検索すると、システムプロパティーが値をクリアしたため、例外がスローされます。
11. インデックスされたプロパティ
エスケープされていないコンマを含む設定値は、 Collection
に変換できます。これは単純なケースでは機能しますが、面倒になり、より高度なケースでは制限されます。
インデックス付きプロパティーは、設定プロパティー名のインデックスを使用して、 Collection
タイプの特定の要素をマップする方法を提供します。インデックス付き要素はプロパティー名の一部であり、値に含まれていないため、これを使用して、複雑なオブジェクトタイプを Collection
要素としてマップすることもできます。以下の例の場合、
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)
を呼び出すと、値 dog
、 cat
、および turtle
が含まれる List<String>
が自動的に作成および変換されます。 Config#getValues("my.indexed.collection", String.class)
を呼び出すと、まったく同じ結果が返されます。同じプロパティー名が両方の形式 (通常およびインデックス付き) に存在する場合、通常の値が優先されます。
インデックス付きのプロパティーは、ターゲットの Collection
に追加される前に、インデックスで並べ替えられます。インデックスに含まれるギャップはターゲットの Collection
に解決されません。つまり、 Collection
の結果にはギャップのないすべての値が格納されます。
12. Quarkus の設定
Quarkus自体は、アプリケーションと同じメカニズムで設定されます。Quarkusは、自身の設定のために quarkus.
名前空間を予約します。例えば、HTTPサーバーポートを設定するには、 quarkus.http.port
を application.properties
に設定します。Quarkusのすべての設定プロパティは 文書化されており、検索可能です。
上述したように、 |
12.1. ビルド時設定
Some Quarkus configurations only take effect during build time (compile), meaning it is not possible to change it 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. This allows Quarkus to provide optimizations and reduce complexity based on the current build
configuration. By default, Quarkus uses the prod
configuration profile to build the application.
ビルド時に固定されたプロパティーは、 すべての設定オプションのリスト でロックアイコン () でマークされます。 |
しかし、いくつかのエクステンションは 実行時にオーバーライド可能な プロパティーを定義しています。定型的な例としては、データベースの URL、ユーザー名とパスワードがあります。これはターゲット環境によって定まるものであり、実行時にセットされ、アプリケーションの動作に影響を与えるものです。
12.2. Config Recording
During the build process, Quarkus proceeds to record the available configuration in the final binary, to ensure it can start successfully in runtime, without missing required configuration. The following sources are excluded from recording:
-
システムプロパティ
-
Environment Variables
-
.env
-
Build System Sources (provided by Maven or Gradle)
12.3. デフォルトの実行時プロファイル
デフォルトの Quarkus 実行時プロファイルは、アプリケーションのビルドに使用されるプロファイルに設定されます。
./mvnw package -Dnative -Dquarkus.profile=prod-aws
./target/my-app-1.0-runner (1)
1 | コマンドは、 prod-aws プロファイルで実行されます。これは quarkus.profile 設定を使用して上書きすることができます。 |
Using a different configuration profile at runtime from the one used to build the application can lead to unexpected results. |
13. Change configuration after build (Reaugmentation)
アプリケーションのビルド後にビルド時の設定を変更する必要があるというまれな状況にある場合は、再オーグメンテーション を使用して、別のビルド時設定のオーグメンテーション出力を再ビルドする方法を確認してください。
14. ビルド時に使用される有効なビルド時設定の追跡
設定ソースは通常、ビルド中に実際に使用されるよりも多くのオプションを提供するため、Quarkusのビルドプロセスで実際に使用された設定オプションを知ることは有益です。
14.1. ビルド中に読み込まれたビルド時設定オプションのダンプ
quarkus.config-tracking.enabled
を true
に設定すると、設定インターセプターが有効になり、ビルドプロセス中に読み込まれたすべての設定オプションを、その値とともに記録します。結果のレポートはデフォルトで ${project.basedir}/.quarkus/quarkus-prod-config-dump
に保存されます。ターゲット・ファイルは以下のオプションで設定できます:
-
quarkus.config-tracking.directory
- 設定ダンプが保存されるディレクトリ、デフォルトは${project.basedir}/.quarkus
-
quarkus.config-tracking.file-prefix
- ファイル名のプレフィックス、デフォルト値はquarkus
-
quarkus.config-tracking.file-suffix
- ファイル名のサフィックス、デフォルト値は-config-dump
-
quarkus.config-tracking.file
- 設定ダンプを保存するファイルへのパス。このオプションはfile-prefix
とfile-suffix
のオプションに優先します。また、値が相対パスでない限り、quarkus.config-tracking.directory
の値にも優先します。
quarkus-prod-config-dump
ファイル名の prod
部分は Quarkus ビルドモードを参照します。これは、ダンプが実稼働環境用のビルドのために取得されたことを示します。
${project.basedir}/.quarkus
ディレクトリーがデフォルトの場所として選択された理由は、ビルド時におけるビルド間の設定変更を追跡しやすくするためです。出力キャッシュツール (Apache Maven Build Cache や Develocity Build Cache など) は、これを指標として使用することで、アプリケーションバイナリーを再構築する必要があるかどうかを判断できます。
14.1.1. 設定オプションのフィルタリング
除外する設定オプション名のコンマ区切りリストを使用して quarkus.config-tracking.exclude
を設定することで、設定トラッカーにレポートから一部のオプションを除外するように指示できます。
14.2. ビルド間のビルド時設定の変化の追跡
quarkus.config-tracking.enabled
は効果的なビルド時設定レポートの生成を有効にしますが、プロジェクトの次のビルドが開始される前に、そのレポートに保存されている値が変更されたかどうかを確認する方法もあります。
Maven プロジェクトでは、 quarkus-maven-plugin
設定に次のゴールを追加できます。
<plugin>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.platform.version}</version>
<extensions>true</extensions>
<executions>
<execution>
<id>track-prod-config-changes</id>
<phase>process-resources</phase>
<goals>
<goal>track-config-changes</goal>
</goals>
</execution>
<!-- other executions would follow below -->
track-config-changes
ゴールは ${project.basedir}/.quarkus/quarkus-prod-config-dump
(ファイル名とディレクトリーは設定可能) を検索し、ファイルがすでに存在する場合は、設定ダンプに保存されている値が変更されているかどうかを確認します。
変更されたオプションを記録し、 ${project.basedir}/target/quarkus-prod-config.check
(ターゲットファイル名と場所は設定可能) の ${project.basedir}/.quarkus/quarkus-prod-config-dump
にある各オプションの現在の値を保存します。ビルド時の設定が前回のビルドから変更されていない場合は、 ${project.basedir}/.quarkus/quarkus-prod-config-dump
と ${project.basedir}/.quarkus/quarkus-prod-config-dump
はまったく同じになります。
14.2.1. Quarkus アプリケーションの依存関係をダンプする
track-config-changes
ゴールは、設定値だけでなく、Quarkus ビルド時の依存関係を含むすべての Quarkus アプリケーションの依存関係もダンプします。
このファイルは、たとえば Develocity のクラスパスのチェックサム機能と組み合わせて、Quarkus ビルドクラスパスが前回の実行以降に変更されたかどうかを確認するために使用できます。
デフォルトでは、依存関係のリストは target/quarkus-prod-dependencies.txt
ファイルに保存されます。プラグインパラメーターを使用して別の場所を設定することもできます。
14.2.2. 記録された設定が見つからない場合、現在のビルド時設定をダンプする
デフォルトでは、 track-config-changes
は前回のビルド時に記録された設定を探し、見つからなければ何もしない。 dumpCurrentWhenRecordedUnavailable
パラメータを有効にすると、 quarkus.config-tracking.*
の設定を考慮して、現在のビルド設定オプションをダンプします。
|
15. 静的初期化フェーズで注入される設定プロパティ値
Quarkus は、静的初期化フェーズ で CDI Bean に注入された設定プロパティー値を収集します。
収集された値はランタイムの初期化値と比較され、不一致が検出されるとアプリケーションの起動は失敗します。
どうしてそんなことが起こるのでしょうか?
たとえば、 org.acme.MyBean
という CDI Bean があるとします。
MyBean
は foo
という名前の @ConfigProperty
を注入し、ネイティブビルド中に初期化されます。
ネイティブビルド中は設定プロパティーが存在しないため、デフォルト値 bar
が使用されます。
しかし、後でアプリケーションが起動されると、プロパティーはシステムプロパティー -Dfoo=baz
で定義されます。
これにより、一貫性のない状態と予期しない動作が発生します。
したがって、この状況になると Quarkus はデフォルトで失敗します。
package org.acme;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.enterprise.context.Initialized;
import org.eclipse.microprofile.config.inject.ConfigProperty;
@ApplicationScoped
public class MyBean {
@ConfigProperty(name = "foo", defaultValue = "bar") (1)
String foo;
void onInit(@Observes @Initialized(ApplicationScoped.class) Object event) { (2)
// this observer method is notified during STATIC_INIT...
}
}
1 | 設定プロパティはBeanの生成時に注入され、値は固定されます。 |
2 | この特定のケースでは、オブザーバー @Initialized(ApplicationScoped.class) が Bean の初期化を引き起こしました。しかし、他の可能性もあります。例えば、静的初期化フェーズでコンポーネントを初期化するエクステンションもあります。 |
注入されたフィールド/パラメータに @io.quarkus.runtime.annotations.StaticInitSafe
のアノテーションを付けることで、静的初期化フェーズで注入された設定オブジェクトを安全に初期化できるようにマークすることができます。
package org.acme;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.enterprise.context.Initialized;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import io.quarkus.runtime.annotations.StaticInitSafe;
@ApplicationScoped
public class MyBeanNoFailure {
@StaticInitSafe (1)
@ConfigProperty(name = "foo", defaultValue = "bar")
String foo;
void onInit(@Observes @Initialized(ApplicationScoped.class) Object event) {
// this observer method is notified during STATIC_INIT...
}
}
1 | 不一致が検出された場合にQuarkusが失敗しないように指示します。 |
16. 追加情報
17. 設定リファレンス
ビルド時に固定される設定プロパティ - 他のすべての設定プロパティは実行時にオーバーライド可能
Configuration property |
タイプ |
デフォルト |
---|---|---|
Set this to Environment variable: Show more |
ブーリアン |
|
A comma separated list of profiles that will be active when Quarkus launches. Environment variable: 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: 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 Environment variable: Show more |
list of URI |
|
Validates that a Environment variable: Show more |
ブーリアン |
|
Enable logging of configuration values lookup in DEBUG log level. Environment variable: Show more |
ブーリアン |
|
What should happen if the application is started with a different build time configuration than it was compiled against. This may be useful to prevent misconfiguration. If this is set to If this is set to Native tests leveraging`@io.quarkus.test.junit.TestProfile` are always run with Environment variable: Show more |
|
|