GAEスタンダード環境Java（with Cloud Endpoints）【「本棚自慢」サイト開発日誌#4】

# 今日のお題
[前回](https://qiita.com/drafts/c834156d426ab293e516)、バックエンドをJava8でWebAPIとして実装し、フロントエンドをAngularで構築するよう方針変換。
最初に実装する機能のWebAPI定義だけ、ざっくりと決めた。
今日は、バックエンドの雛形をGCPのチュートリアル片手に作ってみる。

## ＜参考＞
https://cloud.google.com/appengine/docs/standard/java/tools/maven?hl=ja

# 環境
- 開発端末：Linux（Ubuntu 17.10）
- 言語：Java（v1.8.0_181）
- ビルドツール：Apache Maven（v3.5.0）

## ＜前提＞
- GCPはアカウント取得済み。
- Google Cloud SDK取得・認証済み。
- GAE初期化済み。（ダッシュボードが参照できている状態）
- [App Engine SDK for Java](https://cloud.google.com/appengine/docs/standard/java/download?hl=ja)取得済み。

# 実践
## Mavenによりプロジェクト作成

```
$ mvn archetype:generate -Dappengine-version=1.9.63 -Djava8=true -Dfilter=com.google.appengine.archetypes:
```

- archetypeを選択する。今回は[Cloud Endpoints](https://cloud.google.com/endpoints/docs/openapi/architecture-overview?hl=ja)も使う想定なのと最低限のチュートリアルソースを直していく形を取りたかったので「6」を選択。

```
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: remote -> com.google.appengine.archetypes:appengine-flexible-archetype (A basic Java application with Google App Engine flexible.)
2: remote -> com.google.appengine.archetypes:appengine-skeleton-archetype (A skeleton application with Google App Engine)
3: remote -> com.google.appengine.archetypes:appengine-standard-archetype (A basic Java application with Google App Engine Standard)
4: remote -> com.google.appengine.archetypes:endpoints-skeleton-archetype (A skeleton project using Cloud Endpoints Frameworks with Google App Engine Standard)
5: remote -> com.google.appengine.archetypes:guestbook-archetype (A guestbook application with Google App Engine)
6: remote -> com.google.appengine.archetypes:hello-endpoints-archetype (A simple starter application using Cloud Endpoints Frameworks with Google App Engine Standard)
7: remote -> com.google.appengine.archetypes:skeleton-archetype (Archetype with a README about Google App Engine archetypes)

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 6
```

- その他もろもろ

```
Choose com.google.appengine.archetypes:hello-endpoints-archetype version: 
1: 1.0
2: 1.1
3: 1.1.1-1.9.4
4: 1.1.2-1.9.20
5: 1.1.3-1.9.20
6: 1.1.4-1.9.21
7: 1.1.4-1.9.25
8: 1.1.5-1.9.38
9: 2.0.0
Choose a number: 9: 1

Define value for property 'groupId': bicherregal
Define value for property 'artifactId': bicherregal                                     
Define value for property 'version' 1.0-SNAPSHOT: : 
Define value for property 'package' bicherregal: : 
[INFO] Using property: appengine-version = 1.9.63
Confirm properties configuration:
groupId: bicherregal
artifactId: bicherregal
version: 1.0-SNAPSHOT
package: bicherregal
appengine-version: 1.9.63
 Y: : Y

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 05:15 min
[INFO] Finished at: 2018-08-26T01:08:48+09:00
[INFO] Final Memory: 19M/194M
[INFO] ------------------------------------------------------------------------
```

## プロジェクトをビルド

```
$ mvn clean install
```

</pre>
- リソースファイル未定義のためスキップ
<pre>
[INFO] skip non existing resourceDirectory /work/src/java/github.com/sky0621/bicherregal-ja/bicherregal/src/main/resources
</pre>
- コンパイル
<pre>
[INFO] Compiling 3 source files to /work/src/java/github.com/sky0621/bicherregal-ja/bicherregal/target/bicherregal-1.0-SNAPSHOT/WEB-INF/classes
</pre>
- テストコードが無いので
<pre>
[INFO] No tests to run.
</pre>
- warファイル作成
<pre>
[INFO] Assembling webapp [bicherregal] in [/work/src/java/github.com/sky0621/bicherregal-ja/bicherregal/target/bicherregal-1.0-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp webResources [/work/src/java/github.com/sky0621/bicherregal-ja/bicherregal/target/generated-sources/appengine-endpoints] to [/work/src/java/github.com/sky0621/bicherregal-ja/bicherregal/target/bicherregal-1.0-SNAPSHOT]
[INFO] Copying webapp resources [/work/src/java/github.com/sky0621/bicherregal-ja/bicherregal/src/main/webapp]
[INFO] Webapp assembled in [192 msecs]
[INFO] Building war: /work/src/java/github.com/sky0621/bicherregal-ja/bicherregal/target/bicherregal-1.0-SNAPSHOT.war
</pre>
- ローカルMavenリポジトリにwarファイルをインストール
<pre>
[INFO] Installing /work/src/java/github.com/sky0621/bicherregal-ja/bicherregal/target/bicherregal-1.0-SNAPSHOT.war to /home/koge/.m2/repository/bicherregal/bicherregal/1.0-SNAPSHOT/bicherregal-1.0-SNAPSHOT.war
[INFO] Installing /work/src/java/github.com/sky0621/bicherregal-ja/bicherregal/pom.xml to /home/koge/.m2/repository/bicherregal/bicherregal/1.0-SNAPSHOT/bicherregal-1.0-SNAPSHOT.pom
</pre>

## ローカルで動作確認

```
$ mvn appengine:devserver
```

オープン「http://localhost:8080/」

# まとめ

本当にチュートリアルレベルでローカルで動く雛形を作成。
あとは、このデフォルトソースを元に自分が定義したWebAPI機能を実装していこう。

## 今回できたソースは↓
https://github.com/sky0621/bicherregal-ja/tree/8f2e9752e4b8f6f1dd3457e6e58d1026dac1ae81/bicherregal