QUARKUS で作る爆速 Java Micro Service #1
QUARKUS とは
QUARKUS については Publicky の記事をご確認ください。
準備
Mac を利用していることを前提にします。
Java8
Java8 が必要になります。一度 Java11 で QUAKRUS を試しましたが、不明なエラーが発生し問題解決に時間がかかりそうな感じだったため、Java8 で実施することを強く推奨します。
OpenJDK のホームページから Java8 をダウンロードしてください。brew でインストールするのも手です。
Maven
Maven 3.5 + が必要になります。brew などを利用して 3.5 以上の Maven をダウンロードしてください。QUARKUS のサイトでは Gradle も利用できそうな記述がされていますが、Gradle を試したところ上手くいかないことが多かったため、Maven で実施することを推奨します。
今回検証した環境は以下になっています。
Hello World プロジェクトの作成
Mavenのアーキタイプを指定してプロジェクトの雛形を作成します。
$ mvn io.quarkus:quarkus-maven-plugin:0.22.0:create \
> -DprojectGroupId=com.redhat \
> -DprojectArtifactId=quarkus-sample \
> -DclassName="com.redhat.quarkus_sample.HelloWorld" \
> -Dpath="/hello"
アーキタイプを利用した 2 回目以降のプロジェクト作成では左図のようなログになりますが、初めての QUARKUS プロジェクト作成の場合、Maven リポジトリから QUARKUS 関連のアーティファクトが色々ダウンロードされるため、左のログのようにはなりません。
find コマンドを利用してフォルダ構成を確認してみます。
$ find ./quarkus-sample/
./quarkus-sample/
./quarkus-sample//mvnw.cmd
./quarkus-sample//pom.xml
./quarkus-sample//.dockerignore
./quarkus-sample//.gitignore
./quarkus-sample//.mvn
./quarkus-sample//.mvn/wrapper
./quarkus-sample//.mvn/wrapper/MavenWrapperDownloader.java
./quarkus-sample//.mvn/wrapper/maven-wrapper.properties
./quarkus-sample//.mvn/wrapper/maven-wrapper.jar
./quarkus-sample//mvnw
./quarkus-sample//src
./quarkus-sample//src/test
./quarkus-sample//src/test/java
./quarkus-sample//src/test/java/com
./quarkus-sample//src/test/java/com/redhat
./quarkus-sample//src/test/java/com/redhat/quarkus_sample
./quarkus-sample//src/test/java/com/redhat/quarkus_sample/NativeHelloWorldIT.java
./quarkus-sample//src/test/java/com/redhat/quarkus_sample/HelloWorldTest.java
./quarkus-sample//src/main
./quarkus-sample//src/main/docker
./quarkus-sample//src/main/docker/Dockerfile.native
./quarkus-sample//src/main/docker/Dockerfile.jvm
./quarkus-sample//src/main/resources
./quarkus-sample//src/main/resources/META-INF
./quarkus-sample//src/main/resources/META-INF/resources
./quarkus-sample//src/main/resources/META-INF/resources/index.html
./quarkus-sample//src/main/resources/application.properties
./quarkus-sample//src/main/java
./quarkus-sample//src/main/java/com
./quarkus-sample//src/main/java/com/redhat
./quarkus-sample//src/main/java/com/redhat/quarkus_sample
./quarkus-sample//src/main/java/com/redhat/quarkus_sample/HelloWorld.java
src/main/resources/META-INF/resources/index.html は利用しないからと言って削除したりすると動作しなくなります。ドキュメントには記載がないので注意が必要です。
HelloWorld.java の中身
package com.redhat.quarkus_sample;import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;@Path("/hello")
public class HelloWorld {@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}
TEXT_PLAIN で hello を返却するだけの単純な REST となっています。見た所、JAX-RS を利用しています。
Hello World プロジェクトのビルド
mvn package コマンドを利用してプロジェクトをビルドして jar を作成しましょう。
$ mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------< com.redhat:quarkus-sample >----------------------
[INFO] Building quarkus-sample 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ quarkus-sample ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ quarkus-sample ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/kkosugi/quarkus-sample/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ quarkus-sample ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/kkosugi/quarkus-sample/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ quarkus-sample ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /Users/kkosugi/quarkus-sample/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.0:test (default-test) @ quarkus-sample ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.redhat.quarkus_sample.HelloWorldTest
2019-09-20 16:11:32,450 INFO [io.qua.dep.QuarkusAugmentor] (main) Beginning quarkus augmentation
2019-09-20 16:11:33,126 INFO [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 676ms
2019-09-20 16:11:33,531 INFO [io.quarkus] (main) Quarkus 0.22.0 started in 0.403s. Listening on: http://[::]:8081
2019-09-20 16:11:33,531 INFO [io.quarkus] (main) Installed features: [cdi, resteasy]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.631 s - in com.redhat.quarkus_sample.HelloWorldTest
2019-09-20 16:11:34,414 INFO [io.quarkus] (main) Quarkus stopped in 0.004s
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ quarkus-sample ---
[INFO] Building jar: /Users/kkosugi/quarkus-sample/target/quarkus-sample-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- quarkus-maven-plugin:0.22.0:build (default) @ quarkus-sample ---
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Beginning quarkus augmentation
[INFO] [org.jboss.threads] JBoss Threads version 3.0.0.Beta5
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 751ms
[INFO] [io.quarkus.creator.phase.runnerjar.RunnerJarPhase] Building jar: /Users/kkosugi/quarkus-sample/target/quarkus-sample-1.0-SNAPSHOT-runner.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.474 s
[INFO] Finished at: 2019-09-20T16:11:36+09:00
target ディレクトリに以下の 2 種類の jar ファイルができます。この段階ではまだ Linux のバイナリには置き換わっていません。
- quarkus-sample-1.0-SNAPSHOT-runner.jar
- quarkus-sample-1.0-SNAPSHOT.jar
runner とついている方が FatJar と呼ばれている Jar ファイルで QUARKUS のライブラリ群も jar としてパッケージングされているため、それだけで起動することができます。
Hello World プロジェクトの起動
$ java -jar ./target/quarkus-sample-1.0-SNAPSHOT-runner.jar
上記の画面になったら、ブラウザを開いて以下の URL を開いてください。
上記のように Hello と表示されたら成功です。ターミナルを終了してください。
次回は Docker イメージに含めるよう、Linux バイナリとして出力します。