Quarkus - Creating Your First Application　　やってみた

[^1]: IntelliJ のダウンロード画面では Azul Zulu community™ 15.0.2 aarch64
[^c]: 「[Red HatがクラウドベースのIDE、CodeReady Workspacesを発表](https://thinkit.co.jp/article/15878)」を見ると、CodeReady Workspaces という名前のようです
[^z]: 1.12.0.Final + Zulu OpenJDK で試してみたところ、ここまでで記載した方法では動きませんでしたが、その後 `./mvnw compile quarkus:dev` を実行したところ、こちらは動作しました


AWS Lambda などの Function-as-a-Service (FaaS) に投入する関数を Java で書こうと思って調べたところ、Quarkus (クォーカス) という、Java でマイクロサービスを作るのに適したフレームワークがあると知ったので、試してみました。

一応サーバーが起動するところまで到達できましたが、Quarkus をこれから使いたいという方に役立つ情報というよりは、新技術を試すときにありがちな試行錯誤の記録です。一般に、うまくいった事例だけが記事になって残る傾向があり、新技術にトライする際のトラブルにどう立ち向かうか、あるいはいつ立ち向かうのをやめるかということは記事になることが少ないと思います。今回は、一つの事例として公開させていただきます。

Quarkus の Creating Your First Application で示されているアプリをビルドすることにだけ関心があるという方は、[GraalVM で再度試す](#graalvm-%E3%81%A7%E5%86%8D%E5%BA%A6%E8%A9%A6%E3%81%99)の節だけ参考にしていただけるかもしれません。実施から公開までの間に日が経ってしまい、最新版とは一致しない可能性もありますのでご注意ください。


# Zulu OpenJDK ARMv8 で試す

## 必要なもの

[Quarkus - Creating Your First Application](https://quarkus.io/guides/getting-started) を見ると、必要なもののところに

> * less than 15 minutes
> * an IDE

と書かれているので、15分かからなさそうです。

Maven などは新しいバージョンが必要なようですが、買ったばかりの M1 Mac で環境構築したばかりなので何の問題もありません。IDE にはお気に入りの IntelliJ を使います。JDK は IntelliJ でダウンロードした Zulu OpenJDK ARMv8[^1] です。

## リポジトリのクローン

> ```sh
> git clone https://github.com/quarkusio/quarkus-quickstarts.git
> ```

とガイドには書かれていましたが、IntelliJ 使いなので GUI から実行します。プロジェクトのディレクトリ構成が表示されるようになるまでに、かなり待たされます。

最初は早くもここで集中力が切れて遊んでしまったのですが、改めて別のディレクトリに同じ操作をした様子を画面キャプチャーしたところ、バックグラウンド タスクの完了まで6分26秒かかっていました。あと8分34秒未満でチュートリアル完了ですね！

## Bootstrapping the project

> For Linux & MacOS users
> 
> ```sh
> mvn io.quarkus:quarkus-maven-plugin:1.11.3.Final:create \
>     -DprojectGroupId=org.acme \
>     -DprojectArtifactId=getting-started \
>     -DclassName="org.acme.getting.started.GreetingResource" \
>     -Dpath="/hello"
> cd getting-started
```

とガイドにありますので、実行してみます。

```zsh
% mvn io.quarkus:quarkus-maven-plugin:1.11.3.Final:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=getting-started \
    -DclassName="org.acme.getting.started.GreetingResource" \
    -Dpath="/hello"
[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] Non-resolvable import POM: Could not find artifact io.quarkus:quarkus-bom:pom:999-SNAPSHOT @ line 21, column 19
[ERROR] 'dependencies.dependency.version' for io.quarkus:quarkus-resteasy:jar is missing. @ line 31, column 17
[ERROR] 'dependencies.dependency.version' for io.quarkus:quarkus-smallrye-reactive-messaging-kafka:jar is missing. @ line 35, column 17
[ERROR] 'dependencies.dependency.version' for io.quarkus:quarkus-hibernate-orm-panache:jar is missing. @ line 39, column 17
[ERROR] 'dependencies.dependency.version' for io.quarkus:quarkus-resteasy-jackson:jar is missing. @ line 43, column 17
[ERROR] 'dependencies.dependency.version' for io.quarkus:quarkus-jdbc-postgresql:jar is missing. @ line 47, column 17
[ERROR] 'dependencies.dependency.version' for io.quarkus:quarkus-junit5:jar is missing. @ line 51, column 17
[ERROR] 'dependencies.dependency.version' for org.jboss.resteasy:resteasy-client:jar is missing. @ line 56, column 17
[ERROR] 'dependencies.dependency.version' for io.rest-assured:rest-assured:jar is missing. @ line 61, column 17
[ERROR] 'dependencies.dependency.version' for org.awaitility:awaitility:jar is missing. @ line 66, column 17
 @ 
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]   
[ERROR]   The project org.acme:kafka-panache-quickstart:1.0.0-SNAPSHOT (/Users/hanohrs/git_repos/quarkus-quickstarts/kafka-panache-quickstart/pom.xml) has 10 errors
[ERROR]     Non-resolvable import POM: Could not find artifact io.quarkus:quarkus-bom:pom:999-SNAPSHOT @ line 21, column 19 -> [Help 2]
[ERROR]     'dependencies.dependency.version' for io.quarkus:quarkus-resteasy:jar is missing. @ line 31, column 17
[ERROR]     'dependencies.dependency.version' for io.quarkus:quarkus-smallrye-reactive-messaging-kafka:jar is missing. @ line 35, column 17
[ERROR]     'dependencies.dependency.version' for io.quarkus:quarkus-hibernate-orm-panache:jar is missing. @ line 39, column 17
[ERROR]     'dependencies.dependency.version' for io.quarkus:quarkus-resteasy-jackson:jar is missing. @ line 43, column 17
[ERROR]     'dependencies.dependency.version' for io.quarkus:quarkus-jdbc-postgresql:jar is missing. @ line 47, column 17
[ERROR]     'dependencies.dependency.version' for io.quarkus:quarkus-junit5:jar is missing. @ line 51, column 17
[ERROR]     'dependencies.dependency.version' for org.jboss.resteasy:resteasy-client:jar is missing. @ line 56, column 17
[ERROR]     'dependencies.dependency.version' for io.rest-assured:rest-assured:jar is missing. @ line 61, column 17
[ERROR]     'dependencies.dependency.version' for org.awaitility:awaitility:jar is missing. @ line 66, column 17
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException
```

ものの数秒でエラーになりました。あと8分30秒くらいでチュートリアルを完了できるでしょうか？

IntelliJ で見ると、すべてのモジュールに赤線がついていて、明らかにおかしな状態です。

acme.org というところにアクセスしてみましたが、なんだかドメイン転売業者のサイトっぽく、参考になりそうもありません。

Final バージョンが SNAPSHOT 版にアクセスしているのはおかしいような気がします。これは何を意味しているのでしょう？

[README.md](https://github.com/quarkusio/quarkus-quickstarts/blob/56776ea8517cd275a49eca77342362b9c557219e/README.md) を見ると、

> Use alternative platforms
>
> These quickstart by default currently uses the Quarkus core BOM.

というようなことが書かれていて少し気になります。BOM というのは Byte Order Mark ではなさそうですが、一体なんでしょうか？ (わかる方からご教示いただければ幸いです。)

ここまでで、ここに書かなかったトラブルシューティングも色々と行い、確実に15分は経過しました。よく考えてみれば15分未満が必要とは書いてありましたが、15分未満で十分だとは書いてありませんでしたね。そういえば昔、必要条件と十分条件は違うんだぞ、と先生から教わったなぁ。


## Release バージョンのタグを指定して実行

ふと、リポジトリの更新時刻が1日も経過していない時刻だったことを思い出しました。もしや最新版は壊れているのでは？

[Releases](https://github.com/quarkusio/quarkus-quickstarts/releases) を見てみると、1.11.3.Final が2日前に出ていました。これをチェックアウトして、再度実行してみます。

```zsh
% git checkout 1.11.3.Final
% git clean -df
% mvn clean io.quarkus:quarkus-maven-plugin:1.11.3.Final:create \ 
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=getting-started \
    -DclassName="org.acme.getting.started.GreetingResource" \
    -Dpath="/hello"
[INFO] Scanning for projects...
省略
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- quarkus-maven-plugin:1.11.3.Final:create (default-cli) @ quickstart-projects ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for quickstart-projects 1.0.0-SNAPSHOT:
[INFO] 
[INFO] amazon-dynamodb-quickstart ......................... SUCCESS [  0.024 s]
省略
[INFO] quickstart-projects ................................ FAILURE [  0.317 s]
省略
[INFO] mailer-quickstart .................................. SUCCESS [  0.001 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.082 s
[INFO] Finished at: 2021-02-13T14:42:38+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.11.3.Final:create (default-cli) on project quickstart-projects: Unable to create the project, the directory /Users/hanohrs/git_repos/quarkus-quickstarts/getting-started already exists -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <args> -rf :quickstart-projects
```

先程よりはだいぶ進みました。さすが最終版です。でもビルドは通らないんですね。


## エラーの原因となるディレクトリを削除してから実行

getting-started というディレクトリが存在するとだめっぽいです。そんなこともあろうかと最初から clean を mvn のターゲットに含めていましたが、clean ターゲットが適切に実装されているかは確認していません。`rm -r` で消して再実行します。

```zsh
% mvn clean
省略
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.817 s
[INFO] Finished at: 2021-02-13T14:46:45+09:00
[INFO] ------------------------------------------------------------------------
% rm -r getting-started
% mvn io.quarkus:quarkus-maven-plugin:1.11.3.Final:create \ 
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=getting-started \
    -DclassName="org.acme.getting.started.GreetingResource" \
    -Dpath="/hello"
[INFO] quartz-quickstart .................................. SUCCESS [  0.000 s]
[INFO] qute-quickstart .................................... SUCCESS [  0.000 s]
[INFO] reactive-routes-quickstart ......................... SUCCESS [  0.001 s]
[INFO] quickstart-projects ................................ FAILURE [  0.317 s]
省略
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.082 s
[INFO] Finished at: 2021-02-13T14:42:38+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.11.3.Final:create (default-cli) on project quickstart-projects: Unable to create the project, the directory /Users/hanohrs/git_repos/quarkus-quickstarts/getting-started already exists -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <args> -rf :quickstart-projects
```

また失敗ですね。エラー メッセージに `mvn <args> -rf :quickstart-projects` が案内されていたのに、ただの `rm -r` を使ってしまったのが良くなかったかもしれません。しかし `<args>` というのは具体的になんのことでしょう？ `-e` オプションのようなもののことでしょうか？ それともフェイズやゴールのことでしょうか？ よくわからないので空で実行してみます。


## メッセージに従って `mvn -rf :quickstart-projects` を実行

```zsh
% mvn -rf :quickstart-projects
[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] Child module /Users/hanohrs/git_repos/quarkus-quickstarts/getting-started of /Users/hanohrs/git_repos/quarkus-quickstarts/pom.xml does not exist @ 
 @ 
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]   
[ERROR]   The project io.quarkus.quickstarts:quickstart-projects:1.0.0-SNAPSHOT (/Users/hanohrs/git_repos/quarkus-quickstarts/pom.xml) has 1 error
[ERROR]     Child module /Users/hanohrs/git_repos/quarkus-quickstarts/getting-started of /Users/hanohrs/git_repos/quarkus-quickstarts/pom.xml does not exist
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
```

もはやなんだかわかりません。


## 最初からやり直す

最初からやりましょう。時間計測のために別のディレクトリに clone したのがまさか役に立つことになるとは。

IntelliJ が活躍する段階にあと数分で到達できるとは思えなくなってきましたので、そっと閉じておきます。

```zsh
% rm -rf quarkus-quickstarts
% git clone quarkus-quickstarts-2 quarkus-quickstarts
Cloning into 'quarkus-quickstarts'...
done.
% cd quarkus-quickstarts
% git checkout 1.11.3.Final
Note: switching to '1.11.3.Final'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 8a474ec2 [RELEASE] - Bump version to 1.11.3.Final

% mvn io.quarkus:quarkus-maven-plugin:1.11.3.Final:create -DprojectGroupId=org.acme -DprojectArtifactId=getting-started -DclassName="org.acme.getting.started.GreetingResource" -Dpath="/hello"
[INFO] Scanning for projects...
省略
[INFO] -------------< io.quarkus.quickstarts:quickstart-projects >-------------
[INFO] Building quickstart-projects 1.0.0-SNAPSHOT                       [1/87]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- quarkus-maven-plugin:1.11.3.Final:create (default-cli) @ quickstart-projects ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for quickstart-projects 1.0.0-SNAPSHOT:
[INFO] 
[INFO] amazon-dynamodb-quickstart ......................... SKIPPED
省略
[INFO] quickstart-projects ................................ FAILURE [  0.324 s]
省略
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.044 s
[INFO] Finished at: 2021-02-13T15:04:03+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.11.3.Final:create (default-cli) on project quickstart-projects: Unable to create the project, the directory /Users/hanohrs/git_repos/quarkus-quickstarts/getting-started already exists -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <args> -rf :quickstart-projects
```

同じエラーになってしまったようです。

今更気づいたのですが、org.acme という謎のグループ ID は私がコマンドラインで指定していたのですね。ガイドに載っていた値そのままなのですが、どうして例示なのに com.example とかじゃないんでしょうか？


# サブディレクトリの README に従って GraalVM で試す

改めて https://github.com/quarkusio/quarkus-quickstarts/tree/1.11.3.Final/getting-started を見ると、このディレクトリは元から空じゃないことがわかりました。しかも、このモジュールに関しては、親ディレクトリとは要件が違っていました。

> Requirements
>
> To compile and run this demo you will need:
>
> - JDK 1.8+
> - GraalVM
>
> Configuring GraalVM and JDK 1.8+
>
> Make sure that both the `GRAALVM_HOME` and `JAVA_HOME` environment variables have
> been set, and that a JDK 1.8+ `java` command is on the path.
>
> See the [Building a Native Executable guide](https://quarkus.io/guides/building-native-image-guide)
> for help setting up your environment.

GraalVM 必須なの!?　Apple silicon で GraalVM って安定しているんでしょうか？[^1]

JDK 11 向けに記述が更新されていないところを見ると、1.8 と 11 のどちらが無難なのか、迷うところです。1.8 ならば実績がありそうですが、M1 Mac の JDK 1.8 で実績があるとも思えません。


## Java 11 based GraalVM のインストール

よくわからないときには新しいほうを試す性格です。

[GraalVM Community Edition 21.0.0.2](https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-21.0.0.2) から、Java 11 based の MacOS 版をダウンロードし、IntelliJ でダウンロードした JDK たちの仲間に加えます。

```zsh
% cd ~/Library/Java/JavaVirtualMachines
% tar -xf ~/Downloads/graalvm-ce-java11-darwin-amd64-21.0.0.2.tar.gz
```

~/.zshrc も直しておきます。

```zsh:.zshrc
export JAVA_HOME="$HOME/Library/Java/JavaVirtualMachines/graalvm-ce-java11-21.0.0.2/Contents/Home"
export PATH="$JAVA_HOME/bin:$PATH:$HOME/maven/bin"
```

ターミナルを開き直して mvn -version で確認します。

```zsh
% mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/hanohrs/maven
Java version: 11.0.10, vendor: GraalVM Community, runtime: /Users/hanohrs/Library/Java/JavaVirtualMachines/graalvm-ce-java11-21.0.0.2/Contents/Home
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"
```

良さそうです。念のため、hello, world! くらい動かしてみます。

```zsh
% cd ~/scratches
% cat > Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("hello, world!"); 
    }
} // ここで control + D
% javac Hello.java 
% java Hello 
hello, world!
```

素晴らしい！

### 執筆時には再現しなかった問題の話

実はこのあたりの記述は、Java 8 based の GraalVM で実行して解決不能に陥った後、後述の方法で解決できたために記事にすることにして、改めて記事にするために Java 11 based で実行し直したものです。ところが、Java 8 based のときには実施しないとリンカーか何かに怒られた記憶のある、ダウンロードページの以下のコマンドを実行していません。

> † If you are using macOS Catalina and later you may need to remove the quarantine attribute from the bits before you can use them
> To do this, run the following:
> 
> ```sh
> $ sudo xattr -r -d com.apple.quarantine path/to/graalvm/folder/
> ```

ホーム ディレクトリ以下に展開したファイルにもかかわらず sudo が必要だった気がするのですが、macOS ではそういうものなのでしょうか？ Java 11 based でやり直した際は不要だった理由もよくわかりません。Java 8 based となにか違うのか、mvn で何か違うものを実行してしまってネイティブ イメージ生成まで走ってしまったことが悪さしたとかでしょうか。


## GraalVM でビルドしてみる

さて、GraalVM が無事にインストールできましたので、再度 getting-started のビルドを試してみます。

```zsh
% mvn io.quarkus:quarkus-maven-plugin:1.11.3.Final:create -DprojectGroupId=org.acme -DprojectArtifactId=getting-started -DclassName="org.acme.getting.started.GreetingResource" -Dpath="/hello"
[INFO] Scanning for projects...
省略
[INFO] -------------< io.quarkus.quickstarts:quickstart-projects >-------------
[INFO] Building quickstart-projects 1.0.0-SNAPSHOT                       [1/87]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- quarkus-maven-plugin:1.11.3.Final:create (default-cli) @ quickstart-projects ---
Downloading from central: https://repo.maven.apache.org/maven2/io/quarkus/quarkus-universe-bom/maven-metadata.xml
Downloaded from central: https://repo.maven.apache.org/maven2/io/quarkus/quarkus-universe-bom/maven-metadata.xml (2.1 kB at 1.8 kB/s)
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for quickstart-projects 1.0.0-SNAPSHOT:
[INFO] 
[INFO] amazon-dynamodb-quickstart ......................... SKIPPED
省略
[INFO] quickstart-projects ................................ FAILURE [  2.970 s]
省略
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  6.374 s
[INFO] Finished at: 2021-02-14T09:19:05+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.11.3.Final:create (default-cli) on project quickstart-projects: Unable to create the project, the directory /Users/hanohrs/git_repos/quarkus-quickstarts/getting-started already exists -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <args> -rf :quickstart-projects
```

また同じかー 😩



# che.openshift.io (Eclipse Che) で試す

行き詰まったので諦めることにしました。何らかの JVM 言語で FaaS を使ったアプリを作るにあたり、便利になるなら Quarkus を採用したいと考えていましたが、ここまでハマるとなるとノウハウの蓄積を進めるかガイド文書の品質が向上するまでは使う優先度を下げたほうが良いと思いました。

ところで、FaaS に投入する関数をビルドする環境として Eclipse Che （チェーと読むようです) を試したいと考えていました。クラウド IDE では Microsoft の Visual Studio Code がベースとなっている製品が主流のようで、それならばと本家 Microsoft の GitHub Codespaces を試そうとしたのですが、「テストに参加できるようになったらメールするから待っててね」という展開になってしまいました。そこでその他の選択肢を探したところ、Codenvy というものがあるようで、すぐに利用開始できましたのでこちらを使うことにしました。Red Hat に買収されるようですが、たしかに IBM や Red Hat の製品が使われる分野でなら、GitHub Codespaces だとオープンなイメージが強すぎて使用を認められないケースも出てきそうです。GitHub Codespaces の強力なライバルになるかもしれません。

個人で Red Hat のサービスを利用するのは初めてでしたので、アカウントを作りました。GitHub との SSO 連携でログインできそうに見えたのでその方法を使ってしまったのですが、実際には教えなくていい GitHub のアカウントを教えたことと引き換えにメール アドレスのコピペの手間を減らしてくれる機能だったようです。パスワードの設定は新規に行う必要があり、その後のログイン時には Red Hat のアカウントの ID とパスワードを使用することになりました。今後作成される方には、SSO 連携には期待せず、手でアカウント作成されることを推奨します。

ところで che.openshift.io で提供されているこのサービスの正式名称は、もはや Codenvy ではないのだろうと思うのですが、一体何とお呼びすれば良いサービスなのでしょうか[^c]。とりあえず気にしないで先に進めます。

![quarkus_workspaces.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/4e44bdc7-08ba-497d-e653-21896764e246.png)

さて、ログインしてみたら、Quarkus のワークスペースが選択できるではないですか！ 昨年の記事ですが [Quarkus support in IDE's](https://quarkus.io/blog/march-of-ides/) で Coming Soon! になっていたから諦めていたのに。Red Hat 様のお力に恐れおののくばかりです。

おもむろにクリックして Quarkus REST API のワークスペースを作ってみましょう。

![スクリーンショット 2021-02-13 20.48.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/ec8aaa7c-b6bd-2c0b-6cb6-29d1965aaca5.png)

うーん、プログレス バーが表示されますが、進む気配がありません。

これはサードパーティ クッキーを拒否していたことが原因でした。eloqua というトラッキング目的っぽいもの以外を許可したところ、処理が進むようになりました。ただ、OpenShift のインスタンスかなにかのクッキーが曲者で、ワークスペースを開き直すたびにサブドメインが変わります。WebSocket のために https に限定することもできず、`[*.]8a09.starter-us-east-2.openshiftapps.com` という結構広い範囲で許可してしまいました。

Apple 製品の利用者にはサードパーティ クッキーを拒否する設定を使う方が他にも大勢いらっしゃると思いますので、わかりやすいエラー メッセージの表示が望まれるところです。以下に示す、Google ドライブで PDF ファイルをダウンロードしようとしたときのメッセージのようなものが出ると良いと思います。

![cannot_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/ab8a6f11-75b4-d283-e1b4-b59308cf16c2.png)


少し待つとワークスペースが開きました。

![readme.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/d1ba3df2-8cb5-6550-99f7-01917552f241.png)

こ、これは！ さっき行き詰まっていたときに読んだ README じゃないですか！ つまりこの環境ならビルドが通った実績がありそうです。

とはいうものの、Visual Studio Code は高機能な （特に勝手に再起動されても内容が消えない） メモ帳としてだけ使っているので、どう操作すればプロジェクトをビルドできるのかさっぱり見当がつきません。

闇雲にいろいろ試す中で、Terminal > Run Build Task... を選ぶと、No build task to run found. Configure Build Task... というメニューが出てきました。

![No_build_task_to_run_found.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/e5f78d5f-498f-56e9-a28d-6742bc4c8d55.png)

おお!? なんだかお宝の香りがします！

ボタンを見たら押すものだと漫画で学びました。ポチります。

![Start_Development_mode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/4412e2a3-3499-4d56-7135-26438c41462a.png)

次のメニューが出てきました。よくわからないから上のをポチります。

![tasks.json.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/3a8f9780-0d98-4d06-d723-664f8522573a.png)

tasks.json という、いかにもそれっぽいものが出てきました。

つまり、Java コンパイラーを動かすには Maven が必要で、Maven の xml で定義した設定を実行するためには Visual Studio Code が必要で、Visual Studio Code にビルドさせるには json で定義した設定が必要なんですね？ 違うかもしれませんがそんな気がします。

再度 Terminal > Run Build Task... を実行してみます。

![maven_running.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/a4cdfdea-f067-ef09-f26b-79c8aa85ff18.png)

ゴゴゴゴゴッ！！

リポジトリが同じデータセンター内にあるからか、ちょっぱやです！

![QUARKUS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/7f3650c0-8505-e722-f19d-145124ade7d7.png)

```
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
```

ASCII アートが！！

右下の Open In Preview をポチります。

![Hello che-user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/156e9f2e-3255-7b96-5640-6520040b5ee4.png)

```
hello che-user
```

そ、素っ気ない応答ですが、動きました！！

嬉しい！ 😆



# GraalVM で再度試す

先程の成功したビルドを見ると、そもそも Maven で実行したゴールが create じゃないような気がします。

README の記述はひとまず忘れて、自分だったらこれでビルドできるようにすると思うような引数で実行してみます。

```zsh
% cd ~/git_repos/quarkus-quickstarts/getting-started
% mvn -DprojectGroupId=org.acme \
  -DprojectArtifactId=getting-started \
  -DclassName="org.acme.getting.started.GreetingResource" \
  -Dpath="/hello" \
  package
[INFO] Scanning for projects...
[INFO] 
[INFO] ----------------------< org.acme:getting-started >----------------------
[INFO] Building getting-started 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ getting-started ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ getting-started ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ getting-started ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/hanohrs/git_repos/quarkus-quickstarts/getting-started/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ getting-started ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:3.0.0-M5:test (default-test) @ getting-started ---
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.acme.getting.started.GreetingResourceTest
2021-02-14 10:41:04,319 INFO  [io.quarkus] (main) Quarkus 1.11.3.Final on JVM started in 3.300s. Listening on: http://localhost:8081
2021-02-14 10:41:04,333 INFO  [io.quarkus] (main) Profile test activated. 
2021-02-14 10:41:04,334 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10.213 s - in org.acme.getting.started.GreetingResourceTest
2021-02-14 10:41:07,909 INFO  [io.quarkus] (main) Quarkus stopped in 0.109s
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ getting-started ---
[INFO] 
[INFO] --- quarkus-maven-plugin:1.11.3.Final:build (default) @ getting-started ---
[INFO] [org.jboss.threads] JBoss Threads version 3.2.0.Final
[INFO] [io.quarkus.deployment.pkg.steps.JarResultBuildStep] Building thin jar: /Users/hanohrs/git_repos/quarkus-quickstarts/getting-started/target/getting-started-1.0.0-SNAPSHOT-runner.jar
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 2390ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  20.599 s
[INFO] Finished at: 2021-02-14T10:41:11+09:00
[INFO] ------------------------------------------------------------------------
```

`BUILD SUCCCESS`ッ！ 君を待っていたッ！

実行してみます・・・！

```zsh
% java -jar target/getting-started-1.0.0-SNAPSHOT-runner.jar
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2021-02-14 10:42:59,837 INFO  [io.quarkus] (main) getting-started 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.11.3.Final) started in 1.578s. Listening on: http://0.0.0.0:8080
2021-02-14 10:42:59,868 INFO  [io.quarkus] (main) Profile prod activated. 
2021-02-14 10:42:59,868 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]
```

アスキーアート先生キターー！ 😆

ブラウザで `http://localhost:8080/hello` を開くと

![Hello.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/782342/8b2b96b2-ea64-9a10-17ac-e6de0149dc8e.png)

できました！ ネイティブ イメージではありませんが、Apple silicon 搭載 Mac の GraalVM で実行できることがわかりました。Spring Boot と比べてずいぶん速いように感じられます。

結局、行き詰まって違うことをしたり眠ったりしたので15時間以上かかりましたね・・・ 😅

さすがにもう Zulu OpenJDK でやり直す気力は残っていませんが、たぶんあちらでも動くんじゃないでしょうか。[^z]

というわけで、Quarkus も Che もよくわかりませんが、こんな私でも一切コードを書かずに軽量な REST サービスを Java でつくることができました。


# まとめ

* Quarkus の公式ドキュメントやサンプルの質はまだまだです
* 学校で習った必要条件と十分条件の違いは、社会人になっても重要です
* 新技術を採用しようとして行き詰まったら、諦めることも大事です
    * 他の新技術に触れたときに、思いがけず行き詰まりを打開できることもあります
* Eclipse Che を使うときは、Eclipse IDE の使用経験が役に立ちません
    * むしろ、Visual Studio Code での Java 開発経験があると良さそうです
* クラウド IDE は、特定の環境でビルドできないという現場あるある問題を、本当に解決してくれます
* Quarkus がネイティブ ビルドでなくても速いというのは、体感では事実です
* Quarkus も Eclipse Che もわからないことだらけです
    * どちらも今後が楽しみな、伸びてほしい製品です
    * わかる方からのコメントや記事の投稿をお待ちしております 🙇