QuarkusとGradle
Gradleを使用して、新しいプロジェクトを作成し、エクステンションを追加または削除し、開発モードを起動し、アプリケーションをデバッグし、アプリケーションをjar、ネイティブ実行可能ファイル、またはコンテナフレンドリーな実行ファイルにビルドします。Gradleプロジェクトのメタデータを使用して、お気に入りのIDEにプロジェクトをインポートします。
新規プロジェクトの作成
Gradleプロジェクトを生成するには、 Quarkus CLIまたはQuarkus Mavenプラグインを使用できます:
Kotlin DSLを使用したい場合は、 gradle の代わりに gradle-kotlin-dsl を使用してください。
|
Quarkusプロジェクトのスキャフォールドは、プロジェクトにGradleラッパー( スタンドアロンの Gradle インストールを使用する場合は、Gradle 8.14 を使用します。 |
プロジェクトは、渡されたartifactIdにちなんだ名前のディレクトリに生成されます。
ネイティブモードとJVMモード用の一対のDockerfilesも src/main/docker
で生成されます。これらのDockerfileには、イメージをビルドしてコンテナを実行する手順が書かれています。
JVMモードでのカスタムテスト設定プロファイル
デフォルトでは、JVMモードのQuarkusテストは、 test
設定プロファイルを使用して実行されます。Quarkusの設定プロファイルに慣れていない場合は、 設定プロファイル のドキュメントで必要な情報がすべて説明されていますので、そちらを参照してください。
しかし、以下に示す Gradle ビルド設定でテスト用のカスタム設定プロファイルを使用することは可能です。これは例えば、デフォルトのテストデータベースではない特定のデータベースを使ってテストを実行する必要がある場合に便利です。
今のところ、ネイティブモードでカスタムテスト設定プロファイルを使用することはできません。ネイティブテストは常に |
エクステンションへの対応
Quarkusプロジェクトの内部から、利用可能なエクステンションのリストを取得することができます。
quarkus extension
./gradlew listExtensions
以下を使ってエクステンションを有効化できます。
quarkus extension add hibernate-validator
./gradlew addExtension --extensions='hibernate-validator'
エクステンションは、カンマ区切りのリストを使用して渡されます。
io.quarkus:quarkus-agroal
エクステンション名は、エクステンションのGAV名です。しかし、部分的な名前を渡すことができ、Quarkusは適切なエクステンションを見つけるために最善を尽くします。例えば、 agroal
、 Agroal
、 agro
は io.quarkus:quarkus-agroal
に展開されます。エクステンションが見つからなかったり、複数のエクステンションが一致した場合は、コマンドの結果に赤いチェックマーク❌が表示されます。
$ ./gradlew addExtension --extensions="jdbc,agroal,non-exist-ent"
[...]
❌ Multiple extensions matching 'jdbc'
* io.quarkus:quarkus-jdbc-h2
* io.quarkus:quarkus-jdbc-mariadb
* io.quarkus:quarkus-jdbc-postgresql
Be more specific e.g using the exact name or the full gav.
✅ Adding extension io.quarkus:quarkus-agroal
❌ Cannot find a dependency matching 'non-exist-ent', maybe a typo?
[...]
グロブパターンに一致するエクステンションをすべてインストールすることができます。
quarkus extension add smallrye-*
./gradlew addExtension --extensions='smallrye-*'
開発モード
Quarkusには開発モードが組み込まれています。以下のコマンドで起動することができます:
quarkus dev
./gradlew --console=plain quarkusDev
この方法で実行する場合、継続的テストの使い勝手は同じにはなりません。gradleはデーモンとして実行されるため、Quarkusは「きれいな」テスト出力を描くことができず、出力のログを取るだけになってしまうからです。
その後、アプリケーションのソース、リソース、および設定を更新することができます。変更は実行中のアプリケーションに自動的に反映されます。変更がすぐに反映されるので、UIやデータベースにまたがった開発をするのに最適です。
quarkusDev
は、バックグラウンドでのコンパイルによるホットデプロイを可能にします。つまり、Java ファイルやリソースファイルを変更してブラウザを更新すると、これらの変更が自動的に有効になります。これは、設定プロパティーファイルのようなリソースファイルにも適用されます。ブラウザをリフレッシュする行為は、ワークスペースのスキャンをトリガし、変更が検出された場合、Javaファイルがコンパイルされ、アプリケーションが再配置されると、あなたの要求は再配置されたアプリケーションによって処理されます。コンパイルやデプロイに問題がある場合は、エラーページでお知らせします。
CTRL+C
を押して、アプリケーションを停止します。
開発環境が動作する作業ディレクトリーを変更することができます:
デフォルトでは、 |
デフォルトでは、 CLI
Gradle
|
また、開発環境に環境変数を追加することもできます:
このプラグインは quarkusDev
の設定も公開しています。この設定を使って依存関係を宣言すると、その依存関係の使用が開発モードに制限されます。 quarkusDev
の設定は以下のように使用できます。
リモート開発モード
開発モードをリモートで使用することができるので、コンテナー環境(OpenShiftなど)でQuarkusを実行して、ローカルファイルに加えられた変更をすぐに確認できるようにすることができます。
これにより、実際にアプリを実行するのと同じ環境で、同じサービスにアクセスしながら開発することができます。
本番環境では使用しないでください。開発環境でのみ使用してください。本番環境のアプリケーションを開発モードで実行してはいけません。 |
そのためには、 mutable-jar
のフォーマットを使って mutable アプリケーションを構築する必要があります。 application.properties
で以下のプロパティを設定します。
quarkus.package.jar.type=mutable-jar (1)
quarkus.live-reload.password=changeit (2)
quarkus.live-reload.url=http://my.cluster.host.com:8080 (3)
1 | これは、QuarkusにMutable-jar形式を使用するように指示します。ミュータブルアプリケーションには、Quarkusのデプロイメント時間の部分も含まれているため、より多くのディスクスペースを占有します。普通に実行した場合は、イミュータブルアプリケーションと同じ速度で起動し、同じメモリーを使用しますが、devモードで起動することもできます。 |
2 | リモート側とローカル側の通信を安全に保つためのパスワードです。 |
3 | アプリがdevモードで実行されるURL。これはローカル側でのみ必要なので、プロパティー ファイルから除外して、コマンド ラインでシステム プロパティーとして指定するとよいでしょう。 |
mutable-jar
は、通常のQuarkus jarをビルドするのと同じ方法でビルドできます。つまり、次を実行します。
quarkus build
./gradlew build
リモートホストでQuarkusを起動する前に、環境変数 QUARKUS_LAUNCH_DEVMODE=true
を設定します。ベアメタルを使用している場合は、 export QUARKUS_LAUNCH_DEVMODE=true
コマンドで設定し、適切に java -jar …
コマンドでアプリケーションを実行します。
Docker 経由でアプリケーションを実行する予定の場合は、 docker run
コマンドに -e QUARKUS_LAUNCH_DEVMODE=true
を追加する必要があります。
アプリケーションが起動すると、ログに Profile dev activated. Live Coding activated
の行が表示されます。また、Dockerfile の COPY
コマンドの後に RUN chmod o+rw -R /deployments
を追加して、アプリケーションにデプロイメントリソースの更新権限を付与する必要があります。セキュリティー上の理由から、このオプションは実稼働環境の Dockerfile には追加しないでください。
リモート側にはMavenなどの開発ツールを入れる必要はありません。新しいQuarkusアプリケーションで生成される通常の fast-jar Dockerfileがあれば大丈夫です。ベアメタルのQuarkus runner jarを起動している場合は、通常のdevmodeを実行しようとしないでください。
|
ここで、 remote-dev
コマンドを使用し、ローカルエージェントをリモートホストに接続する必要があります。
./gradlew quarkusRemoteDev -Dquarkus.live-reload.url=http://my-remote-host:8080
これでブラウザを更新するたびに、ローカルで行った変更がリモートアプリにすぐに表示されるようになりました。
すべての設定項目を以下に示します。
ビルド時に固定された設定プロパティー。その他の設定プロパティーは、すべて実行時にオーバーライド可能です。
Configuration property |
タイプ |
デフォルト |
---|---|---|
Whether the live-reload feature should be enabled. Environment variable: Show more |
ブーリアン |
|
Whether Quarkus should enable its ability to not do a full restart when changes to classes are compatible with JVM instrumentation. If this is set to true, Quarkus will perform class redefinition when possible. Environment variable: Show more |
ブーリアン |
|
The names of additional resource files to watch for changes, triggering a reload on change. Directories are not supported. Environment variable: Show more |
list of string |
|
Password used to use to connect to the remote dev-mode application Environment variable: Show more |
string |
|
URL used to use to connect to the remote dev-mode application Environment variable: Show more |
string |
|
The amount of time to wait for a remote dev connect or reconnect Environment variable: Show more |
|
|
The amount of time to wait between attempts when connecting to the server side of remote dev Environment variable: Show more |
|
|
The maximum number of attempts when connecting to the server side of remote dev Environment variable: Show more |
int |
|
期間フォーマットについて
期間の値を書くには、標準の 数字で始まる簡略化した書式を使うこともできます:
その他の場合は、簡略化されたフォーマットが解析のために
|
エクステンションが提供する開発モードの Java オプション
一部のエクステンションでは、開発モードでアプリケーションを起動するコマンドラインに追加する必要がある、事前設定された Java オプションが提供される場合があります。
たとえば、アプリケーションに、開発モード用の Java オプションを提供する 2 つのエクステンション (quarkus-blue
と quarkus-red
) があるとします。
その場合のログは次のようになります
[DEBUG] [io.quarkus.deployment.dev.DevModeCommandLineBuilder] Adding JVM options from org.acme:quarkus-blue::jar
[DEBUG] [io.quarkus.deployment.dev.DevModeCommandLineBuilder] enable-native-access: [ALL-UNNAMED]
[DEBUG] [io.quarkus.deployment.dev.DevModeCommandLineBuilder] add-modules: [jdk.incubator.vector]
[DEBUG] [io.quarkus.deployment.dev.DevModeCommandLineBuilder] enable-preview: []
[DEBUG] [io.quarkus.deployment.dev.DevModeCommandLineBuilder] Adding JVM options from org.acme:quarkus-red::jar
[DEBUG] [io.quarkus.deployment.dev.DevModeCommandLineBuilder] add-opens: [java.base/java.io=ALL-UNNAMED, java.base/java.nio=ALL-UNNAMED]
[INFO] [org.gradle.process.internal.DefaultExecHandle] Starting process 'command '/home/<username>/jdk/bin/java''. Working directory: /home/<username>/gradle-app/build/classes/java/main Command: /home/<username>/jdk/bin/java -Dquarkus.console.basic=true -Dio.quarkus.force-color-support=true -javaagent:/home/<username>/.m2/repository/io/quarkus/quarkus-class-change-agent/{quarkus-version}/quarkus-class-change-agent-{quarkus-version}.jar -Dquarkus-internal.serialized-app-model.path=/home/<username>/gradle-app/build/tmp/quarkusDev/quarkus-app-model.dat -Dquarkus-internal-test.serialized-app-model.path=/home/<username>/gradle-app/build/tmp/quarkusDev/quarkus-app-test-model.dat -XX:TieredStopAtLevel=1 -agentlib:jdwp=transport=dt_socket,address=localhost:5005,server=y,suspend=n --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector --enable-preview -Djava.util.logging.manager=org.jboss.logmanager.LogManager -jar /home/<username>/gradle-app/build/gradle-app-dev.jar
ユーザーは、以下のような disableAll
パラメーターを設定することで、エクステンションが提供するすべての Java オプションを無効にできます。
または、Maven 座標パターンを設定することで、特定のエクステンションが提供する Java オプションを無効にできます。
この設定の場合、ログは次のようになります。
[DEBUG] [io.quarkus.deployment.dev.DevModeCommandLineBuilder] Adding JVM options from org.acme:quarkus-blue::jar
[DEBUG] [io.quarkus.deployment.dev.DevModeCommandLineBuilder] enable-native-access: [ALL-UNNAMED]
[DEBUG] [io.quarkus.deployment.dev.DevModeCommandLineBuilder] add-modules: [jdk.incubator.vector]
[DEBUG] [io.quarkus.deployment.dev.DevModeCommandLineBuilder] enable-preview: []
[DEBUG] [io.quarkus.deployment.dev.DevModeCommandLineBuilder] Skipped JVM options from org.acme:quarkus-red::jar
[INFO] [org.gradle.process.internal.DefaultExecHandle] Starting process 'command '/home/<username>/jdk/bin/java''. Working directory: /home/<username>/gradle-app/build/classes/java/main Command: /home/<username>/jdk/bin/java -Dquarkus.console.basic=true -Dio.quarkus.force-color-support=true -javaagent:/home/<username>/.m2/repository/io/quarkus/quarkus-class-change-agent/{quarkus-version}/quarkus-class-change-agent-{quarkus-version}.jar -Dquarkus-internal.serialized-app-model.path=/home/<username>/gradle-app/build/tmp/quarkusDev/quarkus-app-model.dat -Dquarkus-internal-test.serialized-app-model.path=/home/<username>/gradle-app/build/tmp/quarkusDev/quarkus-app-test-model.dat -XX:TieredStopAtLevel=1 -agentlib:jdwp=transport=dt_socket,address=localhost:5005,server=y,suspend=n --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector --enable-preview -Djava.util.logging.manager=org.jboss.logmanager.LogManager -jar /home/<username>/gradle-app/build/gradle-app-kotlin-dev.jar
デバッグ
開発モードでは、Quarkusはデフォルトでデバッグモードを有効にして起動し、JVMをサスペンドせずにポート 5005
をリッスンします。
この動作は、 debug
システム・プロパティーに以下の値のいずれかを与えることで変更できます。
-
false
- JVMはデバッグモードを無効にして起動します。 -
true
- JVM はデバッグモードで起動され、 `5005`ポートをリッスンします。 -
client
- JVM はクライアントモードで起動し、localhost:5005
に接続を試みます。 -
{port}
- JVM はデバッグモードで開始され、{port}
でリッスンします
追加のシステム・プロパティー suspend
は、デバッグ・モードで起動されたときに JVM をサスペンドするために使用できます。 suspend
は以下の値をサポートしています。
-
y
またはtrue
- デバッグモードの JVM 起動が中断されます。 -
n
またはfalse
- デバッグモードの JVM をサスペンドせずに起動します。
また、JVMをサスペンドした状態で、デバッグモードでQuarkusアプリケーションを実行することもできます。 CLI
Gradle
次に、デバッガーを |
IDE でインポートする
project generated の完了後、それを任意の IDE にインポートできます。唯一の要件は、Maven プロジェクトをインポートできることです。
Eclipse
Eclipse で、 File → Import
をクリックします。ウィザードで、 Gradle → Existing Gradle Project
を選択します。次の画面で、プロジェクトのルートの場所を選択します。次の画面では、見つかったモジュールのリストが表示されるので、生成されたプロジェクトを選択して Finish
をクリックします。
別のターミナルで、次を実行します:
quarkus dev
./gradlew --console=plain quarkusDev
そして、生産性の高い環境をお楽しみください。
IntelliJ IDEA
IntelliJ IDEA:
-
IntelliJ IDEAの内部から
File → New → Project From Existing Sources…
を選択するか、ウェルカム・ダイアログからであれば、Import project
を選択してください。 -
プロジェクトのルートを選択します。
-
Import project from external model
を選択してGradle
-
Next を数回(必要に応じてオプションを確認)
-
最後の画面でFinishをクリックします。
別の端末や組込端末で、次を実行します:
quarkus dev
./gradlew --console=plain quarkusDev
どうぞお楽しみください。
Apache NetBeans
NetBeans:
-
File → Open Project
を選択 -
プロジェクトのルートを選択します。
-
Open Project
をクリックしてください。
別のターミナルまたは組込ターミナルで、プロジェクトのルートに移動して次を実行します:
quarkus dev
./gradlew --console=plain quarkusDev
どうぞお楽しみください。
Visual Studio Code
VS Codeでプロジェクトディレクトリーを開きます。Java Extension Pack(Javaエクステンションのセットをグループ化したもの)をインストールしている場合、プロジェクトはGradleプロジェクトとして読み込まれます。
オフラインでの開発やテストのための依存ファイルのダウンロード
Quarkusのエクステンションの依存関係は、アプリケーションの実行時クラスパス上で終わる実行時エクステンションの依存関係と、ビルドクラスパスを作成するためにアプリケーションのビルド時にQuarkusによってのみ解決されるデプロイメント(またはビルド時)エクステンションの依存関係に分けられます。アプリケーション開発者は、Quarkusのエクステンションの実行時アーティファクトにのみ依存関係を表現することが期待されます。
オフラインでQuarkusアプリケーションを構築してテストするというユースケースを可能にするために、プラグインには quarkusGoOffline
タスクが含まれており、コマンドラインから次のように呼び出すことができます。
./gradlew quarkusGoOffline
このタスクは、アプリケーションの実行時、ビルド時、テスト、開発モードのすべての依存関係をGradleのキャッシュに解決します。実行すると、 --offline
フラグを付けて quarkus タスクを安全に実行できるようになります。
ネイティブ実行可能ファイルのビルド
ネイティブ実行可能ファイルにより、Quarkusアプリケーションはコンテナーやサーバーレスのワークロードに最適です。
GRAALVM_HOME
が設定され、GraalVM の最新リリース (for JDK 21) を指していることを確認してください。
次のようにネイティブ実行可能ファイルの作成します:
quarkus build --native
./gradlew build -Dquarkus.native.enabled=true
ネイティブ実行可能ファイルは、 build/
に存在します。
ネイティブ関連のプロパティーは、 application.properties
ファイルにコマンドライン引数として追加するか、 quarkusBuild
タスクに追加することができます。 quarkusBuild
タスクの設定は以下のように行います:
Gradle Groovy DSL を使用する場合、プロパティーキーは小文字のキャメルケース表記に従わなければなりません。例: |
コンテナーフレンドリーな実行可能ファイルをビルドする
ネイティブ実行可能ファイルは、お使いのオペレーティングシステムに固有のものになります。コンテナー内で実行される実行ファイルを作成するには、次のようにします。
quarkus build --native --no-tests -Dquarkus.native.container-build=true
# The --no-tests flag is required only on Windows and macOS.
./gradlew build -Dquarkus.native.enabled=true -Dquarkus.native.container-build=true
生成される実行ファイルは64bitのLinux実行ファイルになるので、OSによっては実行できなくなる可能性があります。しかし、Dockerコンテナーにコピーするので問題ありません。この場合、ビルド自体もDockerコンテナー内で動作するので、ローカルにGraalVMをインストールする必要はないことに注目してください。
デフォルトでは、ネイティブ実行可能ファイルは 異なる Docker イメージでネイティブ実行可能ファイルをビルドしたい場合 (たとえば、異なる GraalVM バージョンを使用する場合など) は、 利用可能なDockerイメージのリストは、 quay.io にあります。 あるQuarkusのバージョンが、利用可能なすべてのイメージと互換性があるとは限りません。 また、Quarkus 3.19から、デフォルトの ビルダーイメージは UBI 9に基づいています。以前のUBI 8ベースのイメージを使用するには、 quay.ioリポジトリ からイメージを選択してください。 |
ネイティブテストの実行
次のようにネイティブテストを実行します:
./gradlew testNative
This task depends on quarkusBuild
, so it will generate the native image before running the native tests.
デフォルトでは、 |
結合テストの実行
( @QuarkusIntegrationTest
でアノテーションされた)Quarkus結合テストは、Quarkusが生成したアーティファクトで実行されます。これらのテストは、 src/integrationTest/java
ディレクトリに配置し、それを使用して実行することができます。
./gradlew quarkusIntTest
This task depends on quarkusBuild
, so it will generate the artifact before running the integration tests.
fast-jar の使用
fast-jar
がデフォルトの quarkus パッケージタイプになりました。 ./gradlew build
コマンドの結果、 build
の下に quarkus-app
という名前の新しいディレクトリが作成されます。
アプリケーションは次のようにで実行できます: java -jar target/quarkus-app/quarkus-run.jar
生成された jar を正常に実行するためには、 quarkus-app ディレクトリのすべての内容が必要です。いずれかのファイルが欠落していると、アプリケーションが起動しなかったり、正しく機能しない可能性があります。
|
fast-jar パッケージングでは、どの依存関係のjarにクラスやリソースが含まれているかという情報がインデックス化されているため、レガシーのQuarkus jarよりも起動が少し速く、メモリ消費量もわずかに少ないアーティファクトを作成できます。このため、クラスやリソースをロードする際に、 レガシー jar が必要とするクラスパス上のすべての jar を検索する必要がなくなります。
|
UberJar のビルド
Quarkus Gradleプラグインは、以下のように quarkus.package.jar.type
の引数を指定して Uber-Jar の生成をサポートしています。
quarkus build quarkus deploy openshift
./gradlew build -Dquarkus.package.jar.type=uber-jar
UberJar を作成する際に、 --ignored-entry
引数を使用して生成された jar から除外したいエントリーを指定することができます。
./gradlew quarkusBuild -Dquarkus.package.jar.type=uber-jar --ignored-entry=META-INF/file1.txt
エントリーは、生成された Uber-Jar のルートからの相対的なものです。追加の --ignored-entry
引数を追加することで、複数のエントリーを指定することができます。
マルチモジュールプロジェクトでの作業
デフォルトでは、Quarkusは別のモジュール内のCDI Bean を検出しません。
The best way to enable CDI bean discovery for a module in a multi-module project would be to include a META-INF/beans.xml
file,
unless it is the main application module already configured with the io.quarkus
Gradle plugin, in which case it will be indexed automatically.
あるいは、 META-INF/beans.xml
ファイルの代わりに使える非公式の Gradle Jandex プラグイン もあります。
このトピックの詳細については、CDIガイドの Bean Discovery セクションを参照してください。
アプリケーションの発行
Gradle で正しい依存関係のバージョンが使用されていることを担保するために、BOM はビルドファイル内で enforcedPlatform
として宣言されています。デフォルトでは、 maven-publish
プラグインは、この enforcedPlatform
を理由にアプリケーションの公開を阻止します。 build.gradle
ファイルに以下の設定を追加することで、この検証をスキップすることができます。
Quarkusのビルドの設定
Quarkusのビルドに影響を与える設定ソースは複数あり、優先順位順に説明しています。Quarkusのビルドでは、 prod
の設定プロファイルが使用されます:
-
システムプロパティー (例:
./gradlew -Dquarkus.package.jar.type=fast-jar …
) -
システム環境 (例:
QUARKUS_PACKAGE_JAR_TYPE=fast-jar ./gradlew …
) -
Gradle プロジェクトプロパティによる設定 (例:
./gradlew -Pquarkus.package.jar.type=fast-jar
) -
プロジェクトの
application.properties
、application.yaml
、application.yml
ファイル、およびプロジェクトのapplication-prod.properties
、application-prod.yaml
、application-prod.yml
ファイルからの設定
Quarkusプラグインでは、3.0から上記の優先順位が変更されました。古いバージョンのQuarkus Gradleプラグインでは、Gradleビルドの設定よりも application.properties が優先されました。
|
Quarkus Gradleプラグインは、設定の読み込みと解析に"標準"のQuarkusのメカニズムを使用します。Quarkus 3.0では、 application.properties に加えて、 application.(yaml|yml) のサポートが追加されました。また、3.0では、SmallRye Configで利用できるすべてのメカニズムが、暗黙のうちにQuarkus Gradleプラグインでも利用できるようになっています。
|
Quarkus のビルドに使用される有効な設定オプションを表示するには、 quarkusShowEffectiveConfig タスクを使用します。 --save-config-properties コマンドラインオプションを指定すると、設定プロパティは build/<final-name>.quarkus-build.properties ファイルにも保存されます。
|
Gradle キャッシング / タスク入力
デフォルトでは、 quarkus.
で始まるシステムプロパティーと、 QUARKUS_
で始まる環境変数 (`~/.env`からの環境変数を含む) は、Gradle タスクの入力とみなされます。つまり、これらのシステムプロパティーへの変更のみが、Gradle のリビルドをトリガーして最新を保ちます。
他のシステムプロパティーや環境変数を変更しても、Quarkus の Gradle タスク入力は変更されず、不要なリビルドがトリガーされることはありません。
quarkus.quarkusBuildProperties
または Quarkus application.*
設定ファイルを介して指定された設定プロパティーは、すべて Gradle タスク入力とみなされます。つまり、これらのファイルを変更するたびにリビルドが実行されます。。
Quarkus ビルドが quarkus.
で始まらないシステムプロパティー (または QUARKUS_`で始まらない環境変数) を参照する場合は、Quarkus ビルドエクステンションを介して参照する必要があります。たとえば、 `application.properties
ファイルが次のような環境変数を参照するとします。
greeting.message=${FOO_MESSAGE:Hello!}
この場合、"caching relevant" として明示的に宣言する必要があります。
quarkus { cachingRelevantProperties.add("FOO_MESSAGE") // Note: `cachingRelevantProperties` accepts regular expressions }
ビルドワーカー
Quarkusアプリケーションのビルドは、GradleのワーカーAPIを使用して、分離されたプロセスで実行されます。これには、QuarkusアプリケーションのビルドとQuarkusのコード生成が含まれます。これは、 quarkus
エクステンションと Gradle プロジェクトのプロパティから Quarkus のコード生成/アプリケーションビルダーに設定を適切に渡すために必要です。
コード生成やQuarkusビルドを実行するプロセスのJVM設定は、次のように設定できます。詳細については、 JavaForkOptions を参照してください。
キャッシュされたビルドアーティファクト
Gradleのビルドキャッシュ は、以前に生成した出力を再利用することで、ビルド全体の実行時間を改善する非常に効率的な仕組みです(技術的な詳細は Incremental build を参照して下さい)。
Quarkusプラグインは、最新のチェックとビルドキャッシュというgradleのメカニズムを活用します。ビルドキャッシュは、ローカル、ローカル + リモートキャッシュサーバー、またはCI環境で構成されている場合は、 GradleのGitHubアクション や直接/手動でGitHubの GitHubのキャッシュ アクションを使用するなど、キャッシュ全体をアーティファクトとして取得し保存する意味でリモートとすることができます。
Quarkus Gradle プラグインは、何 が、どの環境 (CI またはローカル開発) にキャッシュされているかを考慮します。uber-jar やネイティブバイナリーなどの大きなアーティファクトは CI ではキャッシュされませんが、ローカル開発環境ではキャッシュされます。
Quarkus Gradleプラグインは、 CI 環境変数が存在する場合、 CI環境 を検出します。
|
次の表は、さまざまな Quarkus パッケージタイプが非 CI 環境と CI 環境でどのようにキャッシュされるかを示しています。 タスクの出力が キャッシュ されない場合も up-to-date は適用されることに注意してください。
Quarkus アプリケーションのビルドは 3 つのタスクに分かれています。 `quarkusBuild`タスクは、ビルドされた Quarkus アプリケーションを 提供 する役割を担っています。quarkusDependenciesBuild と quarkusAppPartsBuild のタスクは、内部タスクとみなされます (予告なく変更される可能性があります)。詳細は以下を参照してください。 |
Quarkusパッケージタイプ |
備考 |
キャッシング(非CI) |
キャッシング(CI) |
|
依存関係 jar は、 |
✅ |
✅ |
|
|
✅ |
❌ |
|
|
✅ |
✅ |
ローカル開発環境では、より大きなキャッシュアーティファクトを保存(および取得)するコスト(時間)は、Quarkusアプリケーションを再ビルドするコストよりも低くなります。つまり、Quarkus Gradleプラグインは、非CI環境において、uber-jarやネイティブバイナリのような潜在的に大きな成果物をキャッシュすることができます。コードベースのさまざまな状態に対してビルドを実行するCI環境(メインブランチのすべてのコミットに対してCIを実行することを想定)では、ビルドされた(そして大きな)成果物をビルドキャッシュに追加すると、ビルドキャッシュが不必要に大きくなり、例えば、キャッシュできる成果物の総量が10GBに制限されているGitHubでは問題になります。 |
背景:Gradleには、ビルドのパフォーマンスを向上させるために、2つの関連するメカニズムが働いています:
up-to-date チェックとビルドキャッシュの相互作用の利点には、入力 と 出力 のモデリングコストが伴います。 入力には、ファイルやディレクトリーだけでなく、ビルド時に使用された Java のバージョン、オペレーティングシステム、ワーキングディレクトリー、設定オプションなども含まれます。つまり、タスク操作の出力に影響を与えるすべてが、タスクの入力として宣言される必要があります。 |
Gradle設定キャッシュ
Quarkus Gradle プラグインは、 Gradle の設定キャッシュ を有効にしているビルドで動作しますが、一部の Quarkus タスクでは設定キャッシュが無効になっています。これは、Quarkus プラグインがそのような Gradle ビルドを壊さないことを意味します。現在の互換性の状態は、次の表に示されています。
Quarkus タスク |
設定キャッシュの互換性 |
|
✅ |
|
✅ |
|
✅ |
|
✅ |
|
✅ |
|
✅ |
|
✅ |
|
✅ |
|
✅ |
|
❌ |
|
❌ |
|
❌ |
|
❌ |
|
❌ |
|
❌ |
|
❌ |
|
❌ |
|
❌ |
|
❌ |
|
❌ |
|
❌ |
|
❌ |
Dependency resolver options
Quarkus component variants
disableQuarkusComponentVariants
project property was introduced in Quarkus 3.25.1 to control whether Quarkus component variants should be added to certain dependencies of a project to enable Quarkus conditional and build time (deployment) dependencies. Quarkus component variants are enabled by default since 3.25.1.
The approach to enable Quarkus conditional and extension build time (deployment) dependencies has changed in Quarkus 3.25.1 due to a few issues with the previous implementation. Specifically, the previous implementation would not apply relevant dependency exclusions to enabled conditional and deployment dependencies. It would also appear to leak devmode-only dependencies into non-devmode classpaths (such as test and prod) in some cases. These issues couldn’t be fixed in a reasonable way in the previous implementation, which is why the Quarkus dependency resolution had to be re-implemented based on a different approach using Gradle component variants.
The previous implementation still remains available for now in case the new one appears to introduce not yet detected regressions and can be enabled by setting disableQuarkusComponentVariants
project property to true
.