Helidon 3.0をHelidon Starterを使って最速で試す

# はじめに

先日、Helidon3.0がリリースされました。
Javaのクラウドネィティブ向けフレームワークであるHelidonですが、メジャーバージョンアップを繰り返しており、3.0到達です。

Helidonチームのリリースブログの日本語翻訳版はlogicoさんにより早速公開されています。

- Helidon 3.0 is released

https://logico-jp.io/2022/07/28/helidon-3-0-is-released/

その中でHelidon Starterも紹介されておりましたので、こんなに簡単に試せるというところを紹介したいと思います。

自分自身は過去にMicorProfileのStarterは試したことがあったのですが、Helidon独自で作られている方は知らなかったので、今回試したいと思います。

- 過去記事ご参考:Eclipse MicroProfileの始め方

https://qiita.com/omix222/items/923d788d6ce76e179d6a

# 環境

以下環境の環境で試しました。JavaとMaven使えて、Javaは17以上が必要であれば大丈夫かと思います。

```
\$ java -version
openjdk version "17" 2021-09-14 LTS
OpenJDK Runtime Environment Corretto-17.0.0.35.2 (build 17+35-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.0.35.2 (build 17+35-LTS, mixed mode, sharing)
\$ mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/xxx/.sdkman/candidates/maven/current
Java version: 17, vendor: Amazon.com Inc., runtime: /Users/xxx/.sdkman/candidates/java/17.0.0.35.2-amzn
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "12.4", arch: "x86_64", family: "mac"
```
# レッツトライ

## Starterのサイトからのプロジェクトダウンロード

Helidon Starterのページは以下です。

https://helidon.io/starter/3.0.0

ざっくりとした流れとしは、なんとなく選んでいって、Zipファイルがダウンロードされるので、それを解凍してMavenでビルド、java -jar で実行すればサンプルアプリが立ち上がるという仕組みです。簡単ですね。

最初にFlaver選択ということで、SEかMPか、選びます。Reactiveなど尖った機能を使いたければSE、Java標準の流れを汲むMicro Profileの仕様に沿って開発したければMPを選択します。私はMicro Profileの学習も兼ねたかったのでMPを選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/ea40bd29-fbd9-a8f6-a8f4-1423bf3b326b.png)

次にアプリケーションタイプを選択します。シンプルなものか、DBも含んだものか、カスタムしていくか、という選択です。よく使う形が良いなと思いましたので、DBを選びました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/0eb7967d-02e1-4e8c-6253-b35a62905ca0.png)

次はMedia Supportです。JSONの扱いについて、Jacksonを使うか、標準のJSON-Bを使うのかを選択します。Springでのアプリ開発で使い慣れているのはJacksonですが、ここも標準のメリット享受のため、JSON-Bにしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/a0ed1152-5cd9-daff-94a3-7a3f1542f0d3.png)

次はDBの選択です。JPA実装や、DBMSの種類を何にするか、などを選択します。シンプルな構成にしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/cc39389e-b461-cb4b-229b-c54eb281ce76.png)

あとは名前を適当に決め、ダウンロード実施です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/630c15e9-b34e-253e-65b1-558162a5b449.png)


## ビルドと起動

プロジェクトの構成は以下になっています。

```
├── Dockerfile
├── Dockerfile.jlink
├── Dockerfile.native
├── ObjectStore
│   └── ShadowNoFileLockStore
│       └── defaultStore
│           └── Recovery
│               └── TransactionStatusManager
├── PutObjectStoreDirHere
│   └── ShadowNoFileLockStore
│       └── defaultStore
├── README.md
├── app.yaml
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── myproject
│   │   │               ├── Message.java
│   │   │               ├── Pokemon.java
│   │   │               ├── PokemonResource.java
│   │   │               ├── PokemonType.java
│   │   │               ├── PokemonTypeResource.java
│   │   │               ├── SimpleGreetResource.java
│   │   │               └── package-info.java
│   │   └── resources
│   │       ├── META-INF
│   │       │   ├── beans.xml
│   │       │   ├── init_script.sql
│   │       │   ├── microprofile-config.properties
│   │       │   ├── native-image
│   │       │   │   └── reflect-config.json
│   │       │   └── persistence.xml
│   │       ├── application.yaml
│   │       ├── hibernate.properties
│   │       └── logging.properties
│   └── test
│       ├── java
│       │   └── com
│       │       └── example
│       │           └── myproject
│       │               └── MainTest.java
│       └── resources
│           └── application.yaml
└── target

```
Dockerファイルや、pom.xmlなどの設定もの、最小限のテストコードなども含まれています。

JakartaEE9.1に対応しているため、依存先として、javaxパッケージではなく、jakartaパッケージになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/c38373c0-8bf3-e23e-9828-9771b73f55e8.png)


実際のビルドと起動、実行コードについては、README.mdに書かれています。

```
mvn package
```
でビルドし
```
java -jar target/helidon.sample.starter.jar
```
でアプリを起動させます。

## APIで起動しているアプリへアクセス

アプリを試す、curlコマンド（画面を表示するアプリではなく、WebAPIのアプリサンプルでした）についても、以下の通りで確認できました。これも簡単ですね！
```
\$ curl -X GET http://localhost:8080/simple-greet
{"message":"Hello World!"}%                                                                                             \$ curl -X GET http://localhost:8080/pokemon
[{"id":1,"name":"Bulbasaur","pokemonType":{"id":12,"name":"Grass"},"type":12},{"id":2,"name":"Charmander","pokemonType":{"id":10,"name":"Fire"},"type":10},{"id":3,"name":"Squirtle","pokemonType":{"id":11,"name":"Water"},"type":11},{"id":4,"name":"Caterpie","pokemonType":{"id":7,"name":"Bug"},"type":7},{"id":5,"name":"Weedle","pokemonType":{"id":7,"name":"Bug"},"type":7},{"id":6,"name":"Pidgey","pokemonType":{"id":3,"name":"Flying"},"type":3}]%                                 \$ 
\$ 
\$ curl -X GET http://localhost:8080/type
[{"id":1,"name":"Normal"},{"id":2,"name":"Fighting"},{"id":3,"name":"Flying"},{"id":4,"name":"Poison"},{"id":5,"name":"Ground"},{"id":6,"name":"Rock"},{"id":7,"name":"Bug"},{"id":8,"name":"Ghost"},{"id":9,"name":"Steel"},{"id":10,"name":"Fire"},{"id":11,"name":"Water"},{"id":12,"name":"Grass"},{"id":13,"name":"Electric"},{"id":14,"name":"Psychic"},{"id":15,"name":"Ice"},{"id":16,"name":"Dragon"},{"id":17,"name":"Dark"},{"id":18,"name":"Fairy"}]%                               \$ curl -H "Content-Type: application/json" --request POST --data '{"id":100, "type":1, "name":"Test"}' http://localhost:8080/pokemon
\$ curl -X GET http://localhost:8080/pokemon
[{"id":1,"name":"Bulbasaur","pokemonType":{"id":12,"name":"Grass"},"type":12},{"id":2,"name":"Charmander","pokemonType":{"id":10,"name":"Fire"},"type":10},{"id":3,"name":"Squirtle","pokemonType":{"id":11,"name":"Water"},"type":11},{"id":4,"name":"Caterpie","pokemonType":{"id":7,"name":"Bug"},"type":7},{"id":5,"name":"Weedle","pokemonType":{"id":7,"name":"Bug"},"type":7},{"id":6,"name":"Pidgey","pokemonType":{"id":3,"name":"Flying"},"type":3},{"id":100,"name":"Test","pokemonType":{"id":1,"name":"Normal"},"type":1}]%                                                                                \$ curl -H "Content-Type: application/json" --request POST --data '{"id":101, "type":1, "name":"Test101"}' http://localhost:8080/pokemon
\$ curl -X GET http://localhost:8080/pokemon
[{"id":1,"name":"Bulbasaur","pokemonType":{"id":12,"name":"Grass"},"type":12},{"id":2,"name":"Charmander","pokemonType":{"id":10,"name":"Fire"},"type":10},{"id":3,"name":"Squirtle","pokemonType":{"id":11,"name":"Water"},"type":11},{"id":4,"name":"Caterpie","pokemonType":{"id":7,"name":"Bug"},"type":7},{"id":5,"name":"Weedle","pokemonType":{"id":7,"name":"Bug"},"type":7},{"id":6,"name":"Pidgey","pokemonType":{"id":3,"name":"Flying"},"type":3},{"id":100,"name":"Test","pokemonType":{"id":1,"name":"Normal"},"type":1},{"id":101,"name":"Test101","pokemonType":{"id":1,"name":"Normal"},"type":1}]% 

```

DBも含めているので、POSTしたものをちゃんとGETできることも確認できました！

これだけだとMicro Profileっぽくないので、このアプリに含まれているヘルスチェックについても試します。

```
\$ curl -s -X GET http://localhost:8080/health
{"status":"UP","checks":[]}%     
```
これは、pom.xmlでヘルスチェック関連の依存があり、Jarとして含まれるだけで、特にアプリケーションとしては実装、設定不要で試すことができています。これはやはり簡単ですね。
``` pom.xmlの抜粋
        <dependency>
            <groupId>io.helidon.microprofile.health</groupId>
            <artifactId>helidon-microprofile-health</artifactId>
        </dependency>
```

# まとめ

スターターを動かしただけ、あまり考察入れられてませんでしたが、今回はご紹介ということでこのぐらいにさせてもらいます。
Java関連、SpringBoot以外にもスターターは広がってきており、簡単に試せる状況が増えてきてキャッチアップも楽になってますね！

使ったコードは以下に上げてますので、ソースだけ見たい方はこちらを参照ください。

https://github.com/omix222/helidonstartersample