見出し画像

Quarkusによる開発者の生産性向上: ①Dev Modeでアプリケーション開発を加速させる


はじめに

この記事は、Quarkus in Actionのサンプルアプリケーションを使ってQuarkusの機能を紹介するシリーズの5回目です。今回は、QuarkusにおけるDev Mode (開発モード) の基本的な使い方を説明します。

本記事に登場するQuarkus CLIのインストール方法や実行環境については以下の記事をご覧ください。

Java開発ワークフロー

Java言語は、スクリプト言語とは異なり、プログラムを実行するためにはコンパイルをする必要があるため、コードの修正確認をするのに比較的手間がかかります。

たとえば、JavaのWebアプリケーションを開発しているとしましょう。このJavaプログラムの改修をするとき、開発のワークフローは以下のようになるでしょう。

Step 1. エディタでソースコードを修正
Step 2. ソースコードのコンパイル
Step 3. 単体テストの実行
Step 4. アプリケーションの再起動
Step 5. Webブラウザーを再表示して動作確認

プログラム開発をコマンドを使ってやっている場合は、各ステップでそれに対応するコマンドを実行します。EclipseやVSCodeのような統合開発環境 (IDE) を使っている場合は、IDE内のボタンやメニューの操作で、ビルドや単体テスト、Webアプリケーションの実行ができます。

プログラムの開発をしていると、コーディングミスやロジックのエラーによって思ったように動作しないことがあります。そうすると原因を調べたあとにソースコードの修正をすることになります。

  • コンパイルエラーが検出されれば、ソースコードの修正に戻ります。

  • 単体テストでエラーが出力されれば、ソースコードの修正に戻ります。

  • プログラムを実行して仕様通りに動かなければ、ログ等で原因を調べて、ソースコードの修正に戻ります。

このように何か問題が発生すれば、ソースコードを修正の修正→コンパイル→単体テスト実行→アプリケーションの再起動→Webページの再読込みというループを繰り返すわけです。

プログラムが正しく動くまでにこのループを繰り返すことは仕方ないことですが、ソースコードを変更するたびに手動でループを繰り返すための操作を行うことになります。

Dev Modeとは

Quarkus Dev Mode (開発モード) とは、上述の開発のワークフローを以下のように短縮してくれるモードです。上で説明した途中のStep 2 ~ Step 4は、Quarkusが代わりに実行してくれます。

Step 1. エディタでソースコードを修正
Step 5. Webブラウザーを再表示して動作確認

Dev ModeでQuarkusアプリケーションを起動すると、ソースコードが変更されたときに、コンパイルの実行、単体テストの実行、Quarkus環境への(ビルド後の)コードのリロードというフローを自動で実行してくれます。開発者は、Webブラウザーの表示を再読込みして動作確認をするだけです。

TIPS
Quarkusは、QuarkusのClassloader階層を使うことで、アプリケーション全体の再ビルドや再起動をせずにユーザーコードをライブ・リロードできるようにしています。

これにより、開発者は、スクリプト言語で開発しているような感覚でJavaプログラムの改修をおこなうことができます。コンパイルや単体テスト、アプリケーションリロード時に手動によるコマンド実行やUI操作をする必要がありません。このようなやり方はソースコードの修正後にすぐに効果を確認できるのでライブコーディングとも呼ばれます。

Dev Modeの起動

簡単なRESTプログラムを例にDev Modeにおける開発ワークフローを確認してみます。この記事で使っているQuarkusのバージョンは 3.18.1 です。

$ quarkus create app org.acme:quarkus-in-action --extension quarkus-rest

プログラムsrc/main/java/org/acme/GreetingResource.javaの内容は次の通りです。REST APIのアノテーションを使ってHTTP GETリクエストでパスに/helloが指定されると、"Hello from Quarkus REST"という文字列がレスポンスとして返されます。

@Path("/hello")
public class GreetingResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello from Quarkus REST";
    }
}

Dev Modeは、quarkus devコマンドで起動できます。このコマンドを実行すると、Dev ModeでQuarkusが実行され、Dev Modeで実行したターミナルウィンドウではコマンド入力待ちの状態になります。

#アプリケーションディレクトリへの移動
$ cd quarkus-in-action

# Dev Modeを起動
$ quarkus dev
<略>
Listening for transport dt_socket at address: 5005
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2025-02-03 16:28:43,605 INFO  [io.quarkus] (Quarkus Main Thread) quarkus-in-action 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.18.1) started in 1.179s. Listening on: http://localhost:8080202025-02-03 16:28:43,608 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2025-02-03 16:28:43,609 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, rest, smallrye-context-propagation, vertx]T--
Tests paused
Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>w を入力するとWebブラウザーが起動され、QuarkusのWelcomeページが表示されます。

このDev Modeのターミナルで [w] を入力するとWebブラウザーが起動され、QuarkusのWelcomeページが表示されます。

w コマンドでWebブラウザーを開く

引き続き、Webブラウザー上で http://localhost:8080/hello を開いてREST APIの結果の表示を確認します。

Dev Modeによるライブコーディング

では、準備が整ったのでライブコーディングを試してみましょう。エディタを開き、src/main/java/org/acme/GreetingResource.javaのhello()から返される文字列を"Hello from Quarkus REST"から"Hello note"に置き換えて、ファイルを保存します。

@Path("/hello")
public class GreetingResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello note";
    }
}

Webブラウザーの再読込みボタン (または Ctrl-R) を押して変更した文字列が画面に表示されていることを確認します。

quarkus devを実行したターミナルのログを見ると、ソースコードの変更を検出して、Quarkusにアプリケーションをリロードしたことが表示されます。

Quarkus Dev Modeのログ (正常時)

Dev Modでコンパイルエラーになったら

ここで、故意にコンパイルエラーを発生させるために、プログラムsrc/main/java/org/acme/GreetingResource.javaにおいてhello()内のreturn文のセミコロンを削除して、ファイルを保存します。

@Path("/hello")
public class GreetingResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
         return "Hello note"   // エラーを発生させるためセミコロンを削除
    }
}

このあとWebブラウザーを再読込みすると、コンパイルエラーのメッセージが表示されます。

quarkus devを実行したターミナルのログを見ると、コンパイルエラーが報告されていることを確認できます。

Quarkus Dev Modeのログ (コンパイルエラー発生時)

ここでセミコロンを削除してコンパイルエラーを発生させましたが、以後、続けて同じプロジェクトを使いますので、ソースコードを修正してコンパイルが通るようにしておいてください。

Dev Modeでの単体テストの実行

実はDev Modeのデフォルト設定で単体テストが起動されませんので、単体テストを実行するための操作方法や設定について説明します。

以下のプログラムはREST APIプログラムの単体テストのコードです。このテストの意味は、REST APIの/helloの呼び出し結果が"Hello from Quarkus REST"と同じであればOKということです。

@QuarkusTest
class GreetingResourceTest {
    @Test
    void testHelloEndpoint() {
    given()
        .when().get("/hello")
            .then()
                .statusCode(200)
                    .body(is("Hello from Quarkus REST"));
    }
}

先ほどhello()の戻り値を"Hello note"に変更したので、"Hello from Quarkus REST"と一致しないために、上の単体テストは失敗するはずです。

Dev Modeで単体テストを実行するには、Dev Modeのターミナルで [r] を入力します。この単体テストは失敗したので、以下のようなAssertionErrorがレポートされています。

r コマンドで単体テストを実行

TIPS
Dev Modeで起動時から自動的に単体テストを実行するようにするには、アプリケーションのapplication.propertiesで
    quarkus.test.continuous-testing=enabled
を設定しておきます。詳細は以下のQuarkusガイドを参照してください。

Dev Modeの停止

Dev Modeで起動したターミナルウィンドウで [q] または Ctrl-Cを入力すると終了します。

q コマンドによるDev Modeの停止

まとめ

この記事では、Quarkus Dev Modeについて簡単な使い方を紹介しました。以下にDev Modeのターミナルでよく使うコマンドをまとめておきます。

  • Dev Modeの起動 (quarkus devコマンド)

  • Dev ModeからのWebブラウザーの起動 ([w] コマンド)

  • Dev Modeでの単体テストの起動  ([r] コマンド)

  • Dev Modeの停止 ([q] コマンド)

Dev Modeのターミナルで [h]を入力することでヘルプが表示されます。入力キーを忘れてしまった場合はヘルプを参照してください。

Dev Modeコマンド一覧



いいなと思ったら応援しよう!