3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-07-28

はじめに

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

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

  • Helidon 3.0 is released

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

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

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

環境

以下環境の環境で試しました。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のページは以下です。

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

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

image.png

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

image.png

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

image.png

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

image.png

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

image.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

実際のビルドと起動、実行コードについては、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以外にもスターターは広がってきており、簡単に試せる状況が増えてきてキャッチアップも楽になってますね!

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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?