Quarkus(カーカス)はマイクロサービス、コンテナー向けのスパー軽量Javaフレームワークである。APIサーバーを作りたい時、フレームワークを検討している際 強い候補になるでしょう
主な特徴
- 軽量:SpringBootとかに比較し、起動時間が速い、使用メモリも少なめ、アプリサイズも小さめ
- ネイティブアプリとして実行可能:GraalVMを使ってコンパイルすれば ネイティブアプリになる。SpringBootもできるが、Quarkusは最初からGraalVMのために設計された。SpringBootだとGraalVMのための設定が難しめ。ネイティブになった場合は 起動時間は爆速、使用メモリも激少。JVM上で動かないので
- JavaかKotlin言語で開発可能。MavenかGradleでプロジェクト管理可能
- ネイティブコンパイルに対応したライブラリが豊富になってきた
- Apache License version 2.0ライセンスのOSSである。Red Hat社か主に開発推進
Quarkus
1. CLIをインストール
公式ガイドの一つ SDKMANを使ってQuarkus CLIをインストールする。SDKMAN自体がない場合はここをみると良い
sdk install quarkus
バージョンを確認
quarkus --version
私の場合は、3.18.4が出力された。これから作るプロジェクトの.sdkmanrc
にも入れたいのでに入れたいので今覚えておく。
2. Quarkus CLIでhello worldを作成
quarkus create app --kotlin --gradle-kotlin-dsl --package-name <パッケージ名> <アプリ名>
説明
-
create app
でAPIサーバーとして使われるプロジェクトを作成. これだけ必須 -
--kotlin
開発言語。指定しなかったらJavaになる(Supersonic Subatomic Javaだよ) -
--gradle-kotlin-dsl
プロジェクト管理に使う設定。MavenとGradleとGradle with kotlin DSL選べる。指定しなかったらMavenになる -
--package-name <パッケージ名>
パッケージ名(Java/Kotlinファイルの上に出る1行のベース). 指定しなかったら org.acmeとなる -
<アプリ名>
アーティファクトIDだが、簡単言えばアプリ名. 指定しなかったら code-with-quarkusとなる
任意のパラメーターが多く指定しなかったら おもちゃプロジェクトにより近くなる. より詳細は quarkus create app --help
私の場合は:
quarkus create app --kotlin --gradle-kotlin-dsl --package-name com.ibm.jp bff-server
プロジェクトに入って、ファイル構成を確認してみる
cd bff-server
tree .
├── README.md
├── build.gradle.kts
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle.kts
└── src
├── main
│ ├── docker
│ │ ├── Dockerfile.jvm
│ │ ├── Dockerfile.legacy-jar
│ │ ├── Dockerfile.native
│ │ └── Dockerfile.native-micro
│ ├── kotlin
│ │ └── com
│ │ └── ibm
│ │ └── jp
│ │ └── GreetingResource.kt
│ └── resources
│ └── application.properties
├── native-test
│ └── kotlin
│ └── com
│ └── ibm
│ └── jp
│ └── GreetingResourceIT.kt
└── test
└── kotlin
└── com
└── ibm
└── jp
└── GreetingResourceTest.kt
3. GraalVMをインストール
とりあえず「試してみるだけ」という目的であれば、通常のJVMがセットアップ済であればこのステップをスキップしても良い。
このステップでは、GraalVMをインストールする。SDKMANを使ってインストール+管理をする。
事前に調べたので 私はGraalVMのComunity Editionの最新バージョンが欲しいので以下のコマンドで一発。(availableなバージョンのリストを調べたい場合は sdk list java | grep graal
で一覧取得)
sdk install 23.0.2-graalce
そして sdkmanrcファイルに入れることで チームで同じ設定にすることができる。Quarkusも一緒に入れる
echo java=23.0.2-graalce >> .sdkmanrc
echo quarkus=3.18.4 >> .sdkmanrc
自分の.sdkmanrcはこんな感じ
java=23.0.2-graalce
quarkus=3.18.4
これからローカルで開発をする際に、sdk env
だけをやればいい。(java,quarkusインストールしていない初回はsdk env install
で)
sdk env
4. アプリケーションを起動
基本的な動作・コマンド
4.1 JVM上で動く開発モードで実行
ライブコーディングができる.
./gradlew quarkusDev
4.2 JVM上で動くjarをビルドして実行
buildすると build/quarkus-app/
にjarが配置される。このjarは普通のjarでdependencyを含まない。dependencyはbuild/quarkus-app/lib/
に配置される
./gradlew build # ビルド
java -jar build/quarkus-app/quarkus-run.jar # 実行
4.3 JVMで動くuber jarをビルドして実行
uber jarとは、全てのdependencyを含むjar。何かの理由で手軽に共有したい場合は、これは便利。
./gradlew build -Dquarkus.package.jar.type=uber-jar # ビルド
java -jar build/*-runner.jar # 実行
4.4 ネイティブビルドして実行
ネイティブビルドをするのはGraalVMが必要。ネイティブビルドの実行速度はすごい、メモリ使用量も低、アプリサイズも小さめ。
私たちは上記で GraalVMをインストールしたので、ローカルでもビルドできる
./gradlew build -Dquarkus.package.type=native # ビルド
./build/bff-server-1.0.0-SNAPSHOT-runner # 実行
4.5 コンテナー上でビルド
なんらかの理由でローカルにGraalVMがない場合、コンテナー上でもビルドできる
./gradlew build -Dquarkus.package.type=native -Dquarkus.native.container-build=true # ビルド
5. テスト実行
普通のユニットテストを実行。プロジェクトのtestディレクトリー配下のテストが実行される。
./gradlew test
普通のtest
タスク以外にquarkusTest
, quarkusIntTest
もある。
./gradlew quarkusTest
# OR
./gradlew quarkusTest --continue
# OR
./gradlew quarkusIntTest
# OR
./gradlew quarkusIntTest --continue
それぞれの目的とユースケースのまとめは以下の通り
観点 | quarkusDev |
test |
quarkusTest |
quarkusIntTest |
---|---|---|---|---|
目的 | 開発向け | テスト向け | テスト向け | テスト向け |
ユースケース | デバッグ |
test ディレクトリ配下のユニットテストを実行 |
test ディレクトリ配下のユニットテストを実行 |
native-test ディレクトリ配下の統合テストを実行 |
実行環境 | JVM | JVM + Junit test runner | JVM + Quarkus test runner | Native (GraalVMコンパイル) + Quarkus test runner |
ホットリロード対応 | あり | なし | なし | なし |
テストを実行するか | いいえ | はい | はい | はい |
対話的か | いいえ | いいえ | はい。--continue フラグでオフ可能 |
はい。--continue フラグでオフ可能 |
以上!
See you later!🐊