GWT 2.8.2 と Maven で Hello World する

[Liberica JDK 11 の JavaFX 11 (OpenJFX) で Hello World する](https://qiita.com/takuya0301/items/39b5de96cd671bc3bb76)を書いて、[JavaFX で作ったミニゲームを GWT で Web ブラウザに移植してみる](https://qiita.com/old_horizon/items/5616ba2eaa22b0d7e996)を読んで、[GWT](http://www.gwtproject.org/) ってあったなぁと懐しく思い、[Getting Started](http://www.gwtproject.org/gettingstarted.html) をやってみたのでメモっとく。

最近の Web アプリケーションで、REST という概念との整合性に疲れてきているので、クライアント開発をする上で GWT って素晴らしいんじゃないかなと思ったりしている。[サーバーとブラウザークライアント間の RSocket 通信を Spring Boot と rsocket-js で実装する](https://qiita.com/takuya0301/items/0af269ab164df2e51d71)にも書いたけど、RSocket や gRPC のようなプロトコルの出現を考えると、レガシーながらもクライアントとサーバーの通信を GWT が隠蔽してくれるのはすごい。また、TypeScript のような言語の存在を考えると、GWT の Java から JavaScript へのトランスパイルもすごいことだなぁと。

# 前提条件

この記事では下記バージョンのツールを使用している。

| Tool    | Version   |
|---------|-----------|
| SDKMAN! | 5.7.4+362 |
| Java    | 1.8.0_242 |
| Maven   | 3.6.3     |

ターミナルで確認すると下記のようになっている。

```shell-session
$ sdk version
SDKMAN 5.7.4+362
$ sdk current java
Using java version 8.0.242.hs-adpt
$ sdk current maven
Using maven version 3.6.3
$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.242-b08, mixed mode)
$ mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/takuya/.sdkman/candidates/maven/current
Java version: 1.8.0_242, vendor: AdoptOpenJDK, runtime: /Users/takuya/.sdkman/candidates/java/8.0.242.hs-adpt/jre
Default locale: en_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"
```

# GWT を Homebrew でインストールする

Homebrew を最新にしてから GWT をインストールする。記事執筆時点では GWT 2.8.2 がインストールされた。

```shell-session
$ brew update
$ brew install gwt
```

GWT のインストールが完了したら、webAppCreator が使用できることを確認する。

```shell-session
$ webAppCreator -help
Google Web Toolkit 2.8.2
...
```

# webAppCreator で GWT プロジェクトを作成して Hello World する

下記のコマンドで新規 GWT プロジェクトを作成できる。`maven` オプションで Maven プロジェクトを作成できる。付与しないと Ant プロジェクトになってしまうので注意する。なお、`maven` オプションは非推奨になっており、代わりに `templates` オプションを使う場合は `-templates maven,sample,readme` で同じ結果が得られる。`out` オプションで出力ディレクトリを指定できる。`com.example.myapp.MyApp` はモジュール名である。

```shell-session
$ webAppCreator -maven -out myapp com.example.myapp.MyApp
```

下記のコマンドで実行する。`package` を忘れると動作しないので注意すること。僕は最初 README.txt をきちんと読まずにやって動かなくて困った。

```shell-session
$ cd myapp
$ mvn package gwt:devmode
```

そうすると GWT Development Mode という下記のようなアプリケーションが起動する。

<img width="950" alt="GWT Development Mode" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67627/c81b071a-b4c7-7332-d2dc-d722ee4f9807.png">

Launch Default Browser ボタンをクリックしてブラウザーで表示すると下記のような画面が自動的にコンパイルされた後に表示される。

<img width="960" alt="Web Application Starter Project" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67627/74793204-7c92-4c22-6300-94e2c38a0f1f.png">

Send ボタンをクリックするとサーバーと RPC で通信した結果がダイアログで表示される。

<img width="960" alt="Remote Procedure Call" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67627/baf789d9-1b06-49fe-aa7c-54b9f53d603e.png">

---

今回は GWT 2.8.2 と Maven で Hello World してみた。ちゃんとした開発環境を構築するとなると、Eclipse + GWT Eclipse Plugin か IntelliJ IDEA Ultimate がいいようだ。Eclipse でも IntelliJ でも開発環境を構築できたので、そういう開発環境の構築方法もいずれ記事にしようと思う。

# 参考文献
[GWT](http://www.gwtproject.org/)