Red Hatが、Picoli、gRPC、MicroProfile GraphQL、各種Amazonサービス、Hibernate ORM with Panacheをサポートする新しい拡張機能を搭載したQuarkus 1.5をリリースした。また、新しい 迅速なjar
パッケージング形式とSpring Cache互換性レイヤがある。
「超高速 亜原子 Java」と称されたQuarkusは、"quark"と"us"の混成語だ。これは、GraalVMとOpenJDK HotSpot用に設計されたフルスタック、KubernetesネイティブのJavaフレームワークとして2019年3月に初めて発表された。Quarkusは、MicroProfile、Vert.x、CDI、JAX-RS、Hibernate、Nettyなどのよく知られたJavaライブラリや標準規格から作られている。デビューからわずか8ヶ月、2019年11月にQuarkus 1.0がリリースされた。
Quarkusを正式に紹介するブログ記事では、Quarkusの共同設立者であり、著名なエンジニアであり、Red HatのマネージャーでもあるJason Greene氏が、クラウドネイティブ環境でJavaがどのようにリーダーになれるのかを書きながら論じている。
Quarkusの目標は、JavaをKubernetesやサーバーレス環境における主要なプラットフォームにすることであり、同時に開発者には、より広範な分散型アプリケーションアーキテクチャに最適に対応できるように、統一された反応型および命令型のプログラミングモデルを提供することだ。
今回の記事では、そんな新機能の一部を探っていきたい。
従来のJARパッケージングに代わるものとして、新しい 迅速なjar
パッケージング形式は、より速い起動時間を提供するために設計された。この時の実験的な機能として 迅速なjar
はデフォルトでは起動しない。そのためには、次のような文を application.properties
設定ファイルに追加する。
quarkus.package.type=fast-jar
別の方法は、Mavenコマンドを実行することだ。
$ mvn package -Dquarkus.package.type=fast-jar
Quarkus 1.4で最近導入された新しいコマンドモードにより、開発者はコマンドラインクライアント、バッチスクリプト、コンソールアプリなどのアプリケーションを作成できるようになり、RESTエンドポイントなしで実行できるようになった。Quarkus 1.5では、機能の豊富なコマンドラインアプリケーションを作成するためのJavaライブラリと小さいフレームワークであるPicocliがサポートされた。
現時点では実験的な機能と考えられているが、Picocli拡張機能は、以下のMavenコマンドを実行することで、既存のQuarkus 1.5アプリケーションに追加できる。
$ mvn quarkus:add-extension -Dextensions="picocli"
これは、新しい依存関係を pom.xml
ファイルに追加する。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-picocli</artifactId>
</dependency>
これがどのように機能するか、次の例を考えてみる。
@CommandLine.Command
public class HelloCommand implements Runnable {
@CommandLine.Option(names = {"-n", "--name"}, description = "Who will we greet?", defaultValue = "World")
String name;
private final GreetingService greetingService;
public HelloCommand(GreetingService greetingService) {
this.greetingService = greetingService;
}
@Override
public void run() {
greetingService.sayHello(name);
}
}
@Dependent
class GreetingService {
void sayHello(String name) {
System.out.println("Hello " + name + "!");
}
}
HelloCommand
クラスは Runnable
インターフェイスを実装しており @CommandLine.Command
アノテーションを使用している。インスタンス変数である name
はコマンドラインパラメータ、説明、デフォルト値を定義する @CommandLine.Option
アノテーションを使用している。
下のスクリーンショットに示すように、コマンドラインアプリケーションは、デフォルト値の"World"を使用して実行され、Mavenコマンドの実行時にターミナルウィンドウに"Hello World!"と表示する。
$ mvn clean compile quarkus:dev
定義されたコマンドラインパラメータ。 -n
あるいは --name
を使用して、以下の Maven コマンドの 1 つのように "World"のデフォルト値を上書きできる。
$ mvn clean compile quarkus:dev -Dquarkus.args="-n Mike"
$ mvn clean compile quarkus:dev -Dquarkus.args="--name=Mike"
これでターミナルウィンドウに「Hello Mike!」と出力されるだろう。
API用のオープンソースのデータクエリおよび操作言語であるGraphQLは、スタンドアロンAPIとしてMicroProfile GraphQL 1.0仕様が最近リリースされたことで、MicroProfileファミリーに追加された。SmallRyeによって実装されたQuarkus 1.5は、QuarkusでGraphQLアプリケーションを構築するための拡張機能を提供する。
Picocli拡張機能と同様に、Mavenコマンドを実行することで、GraphQL拡張機能は既存のQuarkus 1.5アプリケーションに追加できる。
$ mvn quarkus:add-extension -Dextensions="graphql"
これは、新しい依存関係を pom.xml
ファイルに追加するだろう。
<dependency>
<groupId>io.quarkus</groupId$gt;
<artifactId>quarkus-smallrye-graphql</artifactId>
</dependency>
Quarkus GraphQLのガイドには、例と、入門する詳細な情報が記載されている。
25周年を迎えた今、Javaはもともとクラウドネイティブ環境のために設計されたものではない。ここ数年でクラウドネイティブやマイクロサービスの時代が到来し、Quarkus、MicroProfile、Helidon、Micronautなどのフレームワークは、Javaがクラウドネイティブ、マイクロサービス、サーバーレス環境のリーダーとなることを可能とする。
資料
- Jason Greene氏によるQuarkusを紹介:次世代KubernetesネイティブJavaフレームワーク (2019年3月7日)
- InfoQによるKubernetesネイティブJavaフレームワークQuarkus (2019年3月25日)
- Emmanuel Bernard氏によるQuarkus 1.0の発表 (2019年11月6日)
- Roberto Cortez氏によるQuarkusの入門 (2020年4月8日)