The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

開発モードと本番アプリケーションの差異

このドキュメントでは、Quarkus の開発モードが本番アプリケーションとどのように異なるかを説明します。

イントロ

Quarkus には開発モード (詳細は こちらこちら) があり、開発に大いに役立ちます。

アーキテクチャの差異

機能セットはさておき、開発モードで実行される Quarkus アプリケーションは、プロダクションアプリケーション (すなわち、 java -jar …​ を使用して実行されるもの) とはアーキテクチャ的に異なります。

開発モードでは、Quarkus は ClassLoader 階層 (詳細は こちら) を使用し、アプリケーションの再ビルドや再起動を必要とせずにユーザーコードのライブリロードを可能にしています。

本番アプリケーションでは、前述のクラスローディングのインフラは全く存在しません。目的に応じて構築された単一の ClassLoader があり、(ほぼ) すべてのクラスと依存関係をロードします。

開発モードの機能

開発者満足を提供するという信条のもと、Quarkus は開発モードを有効にすると多くの機能を提供します。最も重要な機能は以下の通りです。

ライブ・リロード

この非常に重要な機能は、紹介するまでもなく、 アーキテクチャの違い のセクションですでに述べたとおりです。

Dev UI

Quarkusは、ブラウザから /q/dev-ui でアクセスできる非常に便利な UI を提供しています。このUIにより、開発者はアプリケーションの状態を確認できるだけでなく、その状態を変更できるさまざまな操作にアクセスできます(存在するエクステンションに依存)。そのような操作の例としては、以下のようなものがあります:

  • 設定値の変更

  • データベース移行スクリプトの実行

  • キャッシュの消去

  • スケジュールされたオペレーションの実行

  • コンテナのビルド

Quarkus 3.xでは、新しいDev UIが実装されました。 全ての機能が利用できる訳ではありません。 以前のバージョンのDev UIには、 http://localhost:8080/q/dev-ui/ で引き続きアクセスすることが可能です。

エラーページ

開発エラーの診断を非常に簡単にするために、Quarkus は開発モードでの実行時に様々な詳細なエラーページを提供しています。

データベースインポートスクリプト

quarkus-hibernate-orm エクステンションは、Quarkus が開発モードで動作しているときに、 import.sql スクリプトを src/main/resources で実行します。詳細は こちら をご覧ください。

Dev Services

開発モードでテストまたは実行する場合、Quarkus はゼロコンフィグのデータベースをすぐに提供することができますが、これはDev Servicesと呼ばれる機能です。詳細については、こちら をご覧ください。

Swagger UI

quarkus-smallrye-openapi エクステンションは、Quarkus が開発モードで動作しているときに、Swagger UI を公開します。追加情報は こちら をご覧ください。

GraphQL UI

quarkus-smallrye-graphql エクステンションは、Quarkus が開発モードで動作しているときに GraphiQL UI を公開します。詳細は こちら をご覧ください。

Health UI

quarkus-smallrye-health エクステンションは、Quarkus が開発モードで動作しているときに Health UI を公開します。こちら のセクションでは、追加情報を提供します。

Mock mailer

quarkus-mailer エクステンションは、Quarkus が開発モードで動作しているときに、インメモリのモックメールサーバを有効にします。詳しくは こちら をご覧ください。

gRPC

  • gRPC Reflection Service は、開発モードではデフォルトで有効になっています。これにより、grpcurl のようなツールを使用することができます。本番モードでは、リフレクションサービスは無効になっています。quarkus.grpc-server.enable-reflection-service=true を使って明示的に有効にすることができます。

  • 開発モードでは、quarkus.grpc.server.instances は効果がありません。

その他

(アプリケーションに追加されたエクステンションに応じて) 他の設定プロパティがあるかもしれませんが、開発モードでは影響がありません。

パフォーマンスへの影響

開発モードでは、アプリケーションの実行時フットプリントを最小化することは主な目的ではありません (ただし、Quarkus は高速に起動し、メモリをほとんど消費しません)。主な目的は、開発者満足を実現することです。そのため、ライブリロードが実行されるたびに、より多くのクラスがロードされ、ビルド時の操作も行われます。

対照的に、プロダクションアプリケーションでは、Quarkusの主な目的は、最小のメモリを消費し、最小の時間で起動することです。したがって、本番アプリケーションを実行する際には、ビルド時の操作は(定義上)実行されず、ビルド時に必要なさまざまなインフラストラクチャクラスは、実行時にはまったく存在しません。さらに、 fast-jarパッケージタイプに付属する目的に応じて構築されたClassLoaderにより、クラスの検索が可能な限り高速に行われると同時に、メモリ内のjarの量も最小限に抑えられます。

最適なパフォーマンスはdevモードの目的では決してないため、起動時間を改善する目的で、JVMのC2コンパイラーはdevモードでは無効になっています。

セキュリティへの影響

dev-modeアプリケーションを本番環境で実行してはいけない最も重要な理由は、開発モードでは (Dev-UI を介して) 機密性のある情報を読み取ることができる一方で、(本番環境のアプリケーションでは利用できないはずのエンドポイントを公開したり、Dev-UI を介して) 破壊的な操作にアクセスすることができるからです。

ネイティブ実行可能ファイル

ネイティブ実行可能ファイルを作成する場合 (詳しくは こちら)、常に 本番アプリケーションからビルドされます。

関連コンテンツ