GAE/Java8試行（その1：「Java8でWebアプリ作ってデプロイ」）

# お題
GAE(Google App Engine)を理解するために、実際に自分でアプリ作って乗せてみる。
[前回](https://qiita.com/sky0621/items/6175d578d0521858a944)はGAEの構造や特徴について簡単にまとめた。
今回は、Java8で、App Engine用にあらかじめ用意されたMavenアーキタイプでプロジェクトを作ってGAEにデプロイするところまで。

# 開発環境
### # OS
```
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="17.10 (Artful Aardvark)"
```

### # Java
```
$ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
```

### # Maven
```
$ mvn --version
Apache Maven 3.5.0
Maven home: /usr/share/maven
Java version: 1.8.0_181, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-oracle/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "4.13.0-46-generic", arch: "amd64", family: "unix"
```

# 前提
- [スタンダード環境](https://cloud.google.com/appengine/docs/the-appengine-environments?hl=ja)での開発とする。
- GCPプロジェクトは作成済み。

https://cloud.google.com/appengine/docs/standard/java/console/?hl=ja

# 実践
## 01) App Engine用のSDKを取得
![01.png](https://qiita-image-store.s3.amazonaws.com/0/180599/1012eb9e-1507-7837-9c14-66117521b706.png)
![02.png](https://qiita-image-store.s3.amazonaws.com/0/180599/cb93a95c-29c0-8b75-76eb-3f84bfa551dd.png)
![03.png](https://qiita-image-store.s3.amazonaws.com/0/180599/e92c394c-9671-7df5-dad5-6c136a5fef89.png)
以降、下記に従って使えるようセッティング
https://cloud.google.com/appengine/docs/standard/java/download?hl=ja

## 02) Mavenプロジェクト作成
### 適当なGitHubリポジトリを作る
https://github.com/sky0621/java-webapi-for-gae-study

### ローカルに取得した上記リポジトリの中にMavenプロジェクトを作る
```
$ cd java-webapi-for-gae-study/
$ mvn archetype:generate -Dappengine-version=1.9.54 -Djava8=true -Dapplication-id=【プロジェクトID】 -Dfilter=com.google.appengine.archetypes:
[INFO] Scanning for projects...
```

```
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): : 3
```

```
Choose com.google.appengine.archetypes:appengine-standard-archetype version: 
1: 0.1.0
2: 0.1.1
3: 0.2.0
4: 0.3.0
5: 0.4.0
6: 1.0.0
7: 1.0.1
8: 1.0.2
Choose a number: 8: 
```

```
Define value for property 'groupId': com.example.sky0621
Define value for property 'artifactId': sky0621
Define value for property 'version' 1.0-SNAPSHOT: : 
Define value for property 'package' com.example.sky0621: : 
```

```
Confirm properties configuration:
groupId: com.example.sky0621
artifactId: sky0621
version: 1.0-SNAPSHOT
package: com.example.sky0621
CloudSDK_Tooling: true
appengine-version: 1.9.54
application-id: 【プロジェクトID】
java8: true
service: default
useAppEngineApi: false
useEndpoints1: false
useEndpoints2: false
useJstl: true
useObjectify: false
 Y: : Y
```

```
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:05 min
[INFO] Finished at: 2018-10-02T01:24:06+09:00
[INFO] Final Memory: 19M/193M
[INFO] ------------------------------------------------------------------------
```
※Mavenについては下記参照
http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
※Mavenを使ってのGAE用Javaプロジェクト作成については下記参照
https://cloud.google.com/appengine/docs/standard/java/tools/maven?authuser=1&hl=ja

## 03) ローカル環境でビルド・動作確認
### ビルド
```
$ mvn clean install
````

### 動作確認
```
$ mvn appengine:run
```

===============================================
「http://localhost:8080」
===============================================

![04.png](https://qiita-image-store.s3.amazonaws.com/0/180599/b40a8f8f-cc2f-4362-ba78-5176d3c0ac05.png)

===============================================

## 04) GAEにデプロイ
### デプロイ

```
$ mvn appengine:deploy
[INFO] Scanning for projects...
[WARNING] The project com.example.sky0621:sky0621:war:1.0-SNAPSHOT uses prerequisites which is only intended for maven-plugin projects but not for non maven-plugin projects. For such purposes you should use the maven-enforcer-plugin. See https://maven.apache.org/enforcer/enforcer-rules/requireMavenVersion.html
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building sky0621 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------

　　〜省略〜

[INFO] GCLOUD: Services to deploy:
[INFO] GCLOUD: 
[INFO] GCLOUD: descriptor:      [/work/src/java/github.com/sky0621/java-webapi-for-gae-study/sky0621/target/appengine-staging/app.yaml]
[INFO] GCLOUD: source:          [/work/src/java/github.com/sky0621/java-webapi-for-gae-study/sky0621/target/appengine-staging]
[INFO] GCLOUD: target project:  [【プロジェクトID】]
[INFO] GCLOUD: target service:  [default]
[INFO] GCLOUD: target version:  [20181002t014521]
[INFO] GCLOUD: target url:      [https://【プロジェクトID】.appspot.com]
[INFO] GCLOUD: 
[INFO] GCLOUD: 
[INFO] GCLOUD: Beginning deployment of service [default]...
[INFO] GCLOUD: #============================================================#
[INFO] GCLOUD: #= Uploading 18 files to Google Cloud Storage               =#
[INFO] GCLOUD: #============================================================#
[INFO] GCLOUD: File upload done.
[INFO] GCLOUD: Updating service [default]...
[INFO] GCLOUD: .done.
[INFO] GCLOUD: Setting traffic split for service [default]...
[INFO] GCLOUD: ........done.
[INFO] GCLOUD: Deployed service [default] to [https://【プロジェクトID】.appspot.com]
[INFO] GCLOUD: 
[INFO] GCLOUD: You can stream logs from the command line by running:
[INFO] GCLOUD:   $ gcloud app logs tail -s default
[INFO] GCLOUD: 
[INFO] GCLOUD: To view your application in the web browser run:
[INFO] GCLOUD:   $ gcloud app browse
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:04 min
[INFO] Finished at: 2018-10-02T01:46:13+09:00
[INFO] Final Memory: 22M/269M
[INFO] ------------------------------------------------------------------------
```

===============================================
「http://【プロジェクトID】.appspot.com」
===============================================

![05.png](https://qiita-image-store.s3.amazonaws.com/0/180599/2ac198d3-120b-b158-492f-121044856018.png)

===============================================

===============================================
「https://【プロジェクトID】.appspot.com」
===============================================

![05.png](https://qiita-image-store.s3.amazonaws.com/0/180599/2ac198d3-120b-b158-492f-121044856018.png)

===============================================

### GCPコンソールで確認
![06a.png](https://qiita-image-store.s3.amazonaws.com/0/180599/5b48d6cb-65f4-cf81-1ade-fb62329c2864.png)
![07.png](https://qiita-image-store.s3.amazonaws.com/0/180599/7004fbae-afe3-371c-bb7a-cf2381375850.png)
![08.png](https://qiita-image-store.s3.amazonaws.com/0/180599/8c9ca175-e513-3e8e-fddf-9524c28ec174.png)
![09.png](https://qiita-image-store.s3.amazonaws.com/0/180599/d40e63ff-052b-0b01-7889-b38417ffb1b0.png)

# 自動生成プロジェクトの中身
以下になる。これら全て自動生成によるもの。便利。
ついでに言うと、```tree```コマンドも便利。

```
$ tree
.
├── README.md
└── sky0621
    ├── README.md
    ├── nbactions.xml
    ├── pom.xml
    ├── sky0621.iml
    ├── src
    │   ├── main
    │   │   ├── java
    │   │   │   └── com
    │   │   │       └── example
    │   │   │           └── sky0621
    │   │   │               └── HelloAppEngine.java
    │   │   └── webapp
    │   │       ├── WEB-INF
    │   │       │   ├── appengine-web.xml
    │   │       │   ├── logging.properties
    │   │       │   └── web.xml
    │   │       └── index.jsp
    │   └── test
    │       └── java
    │           └── com
    │               └── example
    │                   └── sky0621
    │                       └── HelloAppEngineTest.java
    └── target
        ├── appengine-staging
        │   ├── WEB-INF
        │   │   ├── appengine-generated
        │   │   │   └── app.yaml
        │   │   ├── appengine-web.xml
        │   │   ├── classes
        │   │   │   ├── com
        │   │   │   │   └── example
        │   │   │   │       └── sky0621
        │   │   │   │           └── HelloAppEngine.class
        │   │   │   └── source-context.json
        │   │   ├── lib
        │   │   │   ├── _ah_compiled_jsps-0000.jar
        │   │   │   ├── jstl-1.2.jar
        │   │   │   ├── org.apache.taglibs.taglibs-standard-impl-1.2.5.jar
        │   │   │   ├── org.apache.taglibs.taglibs-standard-spec-1.2.5.jar
        │   │   │   ├── org.eclipse.jdt.core.compiler.ecj-4.4.2.jar
        │   │   │   ├── org.eclipse.jetty.apache-jsp-9.3.18.v20170406-nolog.jar
        │   │   │   ├── org.mortbay.jasper.apache-el-8.0.33.jar
        │   │   │   └── org.mortbay.jasper.apache-jsp-8.0.33.jar
        │   │   ├── logging.properties
        │   │   ├── min-quickstart-web.xml
        │   │   ├── quickstart-web.xml
        │   │   └── web.xml
        │   ├── __static__
        │   ├── app.yaml
        │   └── index.jsp
        ├── generated-sources
        │   └── annotations
        ├── generated-test-sources
        │   └── test-annotations
        ├── maven-archiver
        │   └── pom.properties
        ├── maven-status
        │   └── maven-compiler-plugin
        │       ├── compile
        │       │   └── default-compile
        │       │       ├── createdFiles.lst
        │       │       └── inputFiles.lst
        │       └── testCompile
        │           └── default-testCompile
        │               ├── createdFiles.lst
        │               └── inputFiles.lst
        ├── sky0621-1.0-SNAPSHOT
        │   ├── META-INF
        │   ├── WEB-INF
        │   │   ├── appengine-web.xml
        │   │   ├── classes
        │   │   │   └── com
        │   │   │       └── example
        │   │   │           └── sky0621
        │   │   │               └── HelloAppEngine.class
        │   │   ├── lib
        │   │   │   ├── appengine-api-1.0-sdk-1.9.54.jar
        │   │   │   ├── jstl-1.2.jar
        │   │   │   ├── org.apache.taglibs.taglibs-standard-impl-1.2.5.jar
        │   │   │   └── org.apache.taglibs.taglibs-standard-spec-1.2.5.jar
        │   │   ├── logging.properties
        │   │   └── web.xml
        │   └── index.jsp
        ├── sky0621-1.0-SNAPSHOT.war
        ├── surefire-reports
        │   ├── TEST-com.example.sky0621.HelloAppEngineTest.xml
        │   └── com.example.sky0621.HelloAppEngineTest.txt
        └── test-classes
            └── com
                └── example
                    └── sky0621
                        └── HelloAppEngineTest.class

48 directories, 47 files
```

# まとめ
MavenとApp Engineプラグインを使うと、コマンド一発で https アクセス可能なドメインも用意された状態でWebアプリとしてデプロイされる。
とても楽。今後は、このプロジェクトにGAEの各種機能を試せるような味付けをしていく。