
Quarkusによる開発者の生産性向上: ②アプリケーションの設定を簡単にする
はじめに
この記事は、Quarkus in Actionのサンプルアプリケーションを使ってQuarkusの機能を紹介するシリーズの6回目です。今回はQuarkusアプリケーションの設定について説明します。
本記事に登場するQuarkus CLIのインストール方法や実行環境、quarkus-in-actionサンプルアプリケーションについては以下の記事をご覧ください。
アプリケーションの設定
Quarkusでは、アプリケーションの設定をできる限り簡単にできるように、application.propertiesというプロパティファイルで設定を管理してくれます。このファイルにQuarkusやアプリケーションの設定情報を書いておくことで、環境依存の情報をアプリケーションのソースにハードコードしないようにします。
具体例を見てみましょう。以下のプロパティはquarkus quickstartsにおけるHibernate with Panacheのサンプルプログラムに含まれるapplication.propertiesの内容になります。データベースの種類、データベースにアクセスするためのユーザー名、パスワードなどがプロパティの形で設定されています。%prod.で始まるプロパティの意味については後述します。
%prod.quarkus.datasource.db-kind=postgresql
%prod.quarkus.datasource.username=quarkus_test
%prod.quarkus.datasource.password=quarkus_test
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost/quarkus_test
%prod.quarkus.datasource.jdbc.max-size=8
%prod.quarkus.datasource.jdbc.min-size=2
quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.hibernate-orm.log.sql=true
quarkus.hibernate-orm.sql-load-script=import.sql
TIPS
quarkus-config-yamlエクステンションを使えば、Quarkusアプリケーション設定ファイルとして、YAML形式のapplication.yamlファイルを使うこともできます。
application.propertiesには、組み込みプロパティとアプリケーション固有プロパティを書くことができます。
組み込みプロパティ
Quarkusエクステンションの設定(データソースやスレッドプールなど)はquarkus.プレフィックスで始まる名前アプリケーション固有のプロパティ
quarkus.プレフィックス以外で始まる名前
MicroProfile Config API
MicroProfile Config APIは、MicroProfileの仕様のひとつで、マイクロサービスの設定管理を容易にしてくれます。このAPIを使うとプロパティファイルや環境変数、システムプロパティなどの異なるソースの設定情報に統一的にアクセスできます
参考
MicroProfileは、エンタープライズJavaをマイクロサービスアーキテクチャに最適化するための仕様を公開しています。QuarkusはJarata EEとMicroProfileの両方を実装しています。
Quarkusでは、MicroProfile Config APIを使ってapplication.propertiesに定義されたプロパティをJavaの変数にインジェクトすることができます。
それでは、さっそくquarkus-in-actionサンプルアプリケーションを例に、MicroProfile Config APIの使い方を見ていきます。最初に、quarkus-in-actionを開発モード (Dev Mode) で起動しておきます。
$ quarkus dev
quarkus-in-actionのsrc/main/resources/application.propertiesにgreetingのプロパティを設定します。
greeting=Hello configuration
TIPS
前回の記事で紹介した開発モード (Dev Mode) では、ソースコードだけでなく、application.propertiesのようなリソースファイルについても、ファイルが変更されると、アプリケーションに動的に読み込まれます。
GreetingResourceのソースをMicroProfile Config API使ってapplication.propertiesからプロパティを取り出すように修正します。
1 package org.acme;
2
3 import org.eclipse.microprofile.config.inject.ConfigProperty;
<略>
10 @Path("/hello")
11 public class GreetingResource {
12 @ConfigProperty(name = "greeting")
13 String greeting;
14
15 @GET
16 @Produces(MediaType.TEXT_PLAIN)
17 public String hello() {
18 return greeting;
19 }
20 }
12行目の@ConfigProperty(name="greeting")により、applications.propertiesのgreetingの値が、String型の変数greetingにインジェクトされます。
18行目ではhello()の戻り値として変数greetingの値を返しています。
アプリケーションをDev Modeで実行しているので、再ビルドをしなくとも、Webブラウザーで http://localhost:8080/hello を開くと、Hello configurationと表示されます。

設定プロファイル
Quarkusでは、開発のライフサイクルごとに設定を切り替えることが可能です。これにより、開発環境と本番環境でデーターベースサーバーを切り替えるようなことが可能になります。
Quarkusには、デフォルトで3つの設定プロファイルがあります。
prod—アプリケーションがプロダクションモードで実行中にアクティブ
dev—アプリケーションが開発モード(Dev Mode)で実行中にアクティブ
test—アプリケーションがテスト中にアクティブ.
環境に応じてプロパティを変更するには、application.propertiesにおいて %<プロファイル名>.<通常のプロパティ名> のように指定します。
たとえば、HTTPのポート番号を設定するプロパティはquarkus.http.portですが、開発モードのときにHTTPのポート番号を8080から7777に変更する場合は、次のようになります。
%dev.quarkus.http.port=7777
別の方法として、application-dev.properties というファイルにquarkus.http.port=7777 と書くこともできます。
プロパティの優先順位としては、プロファイルを指定したプロパティがある場合はそれが指定され、なければ通常のプロパティが適用されます。たとえば、次の設定では開発モードの場合だけ値が7777で、プロダクションやテストの場合は8080になります。
%dev.quarkus.http.port=7777
quarkus.http.port=8080
アプリケーションプロパティの上書き
MicroProfile Config APIでは、複数のソースにプロパティを設定することが可能です。複数のソースに同一のキーのプロパティが設定されている場合、次の優先順位でプロパティの値が決定します。
システムプロパティ
環境変数
application.properties
この優先順位によって、システムプロパティや環境変数を使い、application.propertiesに設定された値を実行時に上書きすることができます。
具体的な例としては、application.propertiesで設定されたHTTPサーバーのポート番号8080がすでに自分の環境で使われている場合、application.propertiesの設定を変更するのではなく、環境変数で8081に置き換えるといった使い方ができます(~/.bashrcに定義しておくと便利です)。
では、このプロパティの上書きをquarkus-in-actionサンプルプログラムを使って試してみましょう。環境変数とシステムプロパティの両方を設定して、quarkus devを実行します。
$ export GREETING="Environment variable value"
$ quarkus dev -Dgreeting="System property value"
注意
環境変数の場合は大文字にして、ドットはアンダーラインに置き換えます。
たとえば、application.propertiesとしてmy.greetingというプロパティがあった場合、これを環境変数で上書きするににはMY_GREETINGとします。
Webブラウザーで http://localhost:8080/hello を開くと、システムプロパティの方が優先されるので、 "System property value"と表示されます。

次に、環境変数だけ指定してquarkus devを実行し、結果を比較します。
$ export GREETING="Environment variable value"
$ quarkus dev
Webブラウザーで http://localhost:8080/hello を開くと、システムプロパティが優先されるので、 "Environment property value"と表示されます。

まとめ
この記事では、Quarkusにおけるアプリケーション設定の方法を説明しました。Quarkusで複数のエクステンションを使っていると、application.propertiesにたくさんの設定情報を書くことになりますので、使い方の基本は知っておいた方が良いでしょう。
Quarkusアプリケーションでは、Quarkusやアプリケーション設定をapplication.propertiesに一元管理します。
プロダクション、開発、テストなど環境によって異なるプロパティを設定したい場合は設定プロファイルを使うことができます。
MicroProfile Config APIを使うことで、環境変数やシステムプロパティでapplication.propertiesの設定値を上書きすることも可能です。
アプリケーション設定の詳細は、以下のガイドを参照してください。