[3分で完結][備忘録]Micronautのインストールから実行まで

JVMベースのフルスタックフレームワークであるMicronautで遊びたかったのでインストールから実行までの流れを簡単にまとめました。

## 環境

- macOS Catalina 10.15

## 環境構築

### sdkmanのインストール
sdkmanはパッケージマネージャー
sdkman経由でjdkとか他ツールを入れればバージョン管理が簡単になる

ちなみに筆者はこういうツールが大の苦手
自分でコツコツと入れたい派（そんな派閥はない？

下記コマンドを実行

```
$ curl -s https://get.sdkman.io | bash
```

```
All done!

Please open a new terminal, or run the following in the existing one:

    source "/Users/tshk_dev/.sdkman/bin/sdkman-init.sh"

Then issue the following command:

    sdk help

Enjoy!!!
```
で、次に下記のコマンドを打って、バージョンが出ればSDKMANインストール完了

```
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
$ sdk version
SDKMAN 5.7.3+337
```

### Javaインストール(既にインストール済の人は不要）
どのJavaがインストールできるか確認する

```
$sdk list java
================================================================================
Available Java Versions
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
 AdoptOpenJDK  |     | 13.0.0.j9    | adpt    |            | 13.0.0.j9-adpt      
               |     | 13.0.0.hs    | adpt    |            | 13.0.0.hs-adpt      
               |     | 12.0.2.j9    | adpt    |            | 12.0.2.j9-adpt      
               |     | 12.0.2.hs    | adpt    |            | 12.0.2.hs-adpt      
               |     | 11.0.4.j9    | adpt    |            | 11.0.4.j9-adpt      
               |     | 11.0.4.hs    | adpt    |            | 11.0.4.hs-adpt      
               |     | 8.0.222.j9   | adpt    |            | 8.0.222.j9-adpt     
               |     | 8.0.222.hs   | adpt    |            | 8.0.222.hs-adpt     
 Amazon        |     | 11.0.5       | amzn    |            | 11.0.5-amzn         
               |     | 8.0.232      | amzn    |            | 8.0.232-amzn        
               |     | 8.0.202      | amzn    |            | 8.0.202-amzn        
 Azul Zulu     |     | 13.0.1       | zulu    |            | 13.0.1-zulu         
               |     | 12.0.2       | zulu    |            | 12.0.2-zulu         
               |     | 11.0.5       | zulu    |            | 11.0.5-zulu         
               |     | 10.0.2       | zulu    |            | 10.0.2-zulu         
               |     | 9.0.7        | zulu    |            | 9.0.7-zulu          
               |     | 8.0.232      | zulu    |            | 8.0.232-zulu        
               |     | 8.0.202      | zulu    |            | 8.0.202-zulu        
               |     | 7.0.181      | zulu    |            | 7.0.181-zulu        
 Azul ZuluFX   |     | 11.0.2       | zulufx  |            | 11.0.2-zulufx       
               |     | 8.0.202      | zulufx  |            | 8.0.202-zulufx      
 BellSoft      |     | 13.0.0       | librca  |            | 13.0.0-librca       
               |     | 12.0.2       | librca  |            | 12.0.2-librca       
               |     | 11.0.4       | librca  |            | 11.0.4-librca       
               |     | 8.0.222      | librca  |            | 8.0.222-librca      
 GraalVM       |     | 19.2.1       | grl     |            | 19.2.1-grl          
               |     | 19.1.1       | grl     |            | 19.1.1-grl          
               |     | 19.0.2       | grl     |            | 19.0.2-grl          
               |     | 1.0.0        | grl     |            | 1.0.0-rc-16-grl     
 Java.net      |     | 14.ea.18     | open    |            | 14.ea.18-open       
               |     | 13.0.1       | open    |            | 13.0.1-open         
               |     | 12.0.2       | open    |            | 12.0.2-open         
               |     | 11.0.2       | open    |            | 11.0.2-open         
               |     | 10.0.2       | open    |            | 10.0.2-open         
               |     | 9.0.4        | open    |            | 9.0.4-open          
 SAP           |     | 12.0.2       | sapmchn |            | 12.0.2-sapmchn      
               |     | 11.0.4       | sapmchn |            | 11.0.4-sapmchn      
================================================================================
Use the Identifier for installation:

    $ sdk install java 11.0.3.hs-adpt
================================================================================
```
**AdoptOpenJDK 11.0.4.hs**　
君に決めた！（特に理由はない）
さっそく下記コマンドをポチ

```
$ sdk install java 11.0.4.hs-adpt

Installing: java 11.0.4.hs-adpt
Done installing!

Setting java 11.0.4.hs-adpt as default.
```
インストールが完了して、下記コマンドで確認

```
$ java --version
openjdk 11.0.4 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.4+11)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.4+11, mixed mode)
```

### Micronautインストール
本命のMicrinautのインストール
下記コマンドをポチ

```
$ sdk install micronaut

Installing: micronaut 1.2.5
Done installing!


Setting micronaut 1.2.5 as default.
```

Micornautのコマンドでバージョン確認

```
$ mn --version
Resolving dependencies..
| Micronaut Version: 1.2.5
| JVM Version: 11.0.4
```

環境構築は以上

## アプリケーション
動作確認のための簡単なアプリを作成

### プロジェクト作成
サンプルプロジェクトはMicornautコマンドで作れる
※プロジェクトフォルダを作成したいディレクトリに移動してからポチってね

```
$ mn create-app sample-app
```

このままでも実行できるけど、公式サイトに沿ってブラウザで「Hello World」が表示されるまでやってみる

### コントローラ作成
下記のJavaクラスを用意する
src/main/java/sample/app/HelloController.java

```java:HelloController.java

package sample.app;

import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Produces;

@Controller("/hello") 
public class HelloController {
    @Get("/") 
    @Produces(MediaType.TEXT_PLAIN) 
    public String index() {
        return "Hello World"; 
    }
}
```

### ビルド

```
$ ./gradlew build
```

### 実行

```
$ ./gradlew run

> Task :run
15:29:48.877 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 632ms. Server Running: http://localhost:8080
```
ブラウザから
http://localhost:8080/hello
にアクセス
<img width="494" alt="スクリーンショット 2019-10-29 15.33.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51062/728bca6a-21f3-49a5-f25f-b20319702e4f.png">

これで完了

## テスト (ついで）

### テストクラス作成
src/test/java/sample/app/HelloControllerTest.java

```java:HelloControllerTest.java

package sample.app;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import io.micronaut.http.HttpRequest;
import io.micronaut.http.client.RxHttpClient;
import io.micronaut.http.client.annotation.Client;
import io.micronaut.test.annotation.MicronautTest;
import org.junit.jupiter.api.Test;

import javax.inject.Inject;

@MicronautTest 
public class HelloControllerTest {

    @Inject
    @Client("/")
    RxHttpClient client; 

    @Test
    public void testHello() {
        HttpRequest<String> request = HttpRequest.GET("/hello"); 
        String body = client.toBlocking().retrieve(request);

        assertNotNull(body);
        assertEquals("Hello World", body);
    }
}
```
### テスト実行
```
$ ./gradlew test
```

### テスト結果
テストレポートが生成されているのでブラウザで確認
build/reports/tests/test/index.html

<img width="922" alt="スクリーンショット 2019-10-29 15.48.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51062/c4001c0c-eafd-5a30-233b-d76e3d5e0ee3.png">

## 最後
後半は説明書くこともないくらいだったので手抜きですが参考までに
（ほぼ公式サイトに沿ってますが）