GAE/Java8試行（その9：「デプロイ失敗事例（その２）」

# お題
この間、[デプロイに失敗した事例の記事](https://qiita.com/sky0621/items/d89c7473fd5207edcfd5)を書いた。
今回、Mavenで[Cloud Endpoints Frameworksのスケルトンプロジェクトを作って](https://qiita.com/sky0621/items/c0119c0855b596ae4c57#mavenプロジェクト生成)GAEへのデプロイを試みたところ、再びデプロイ失敗したので、その原因と解決法を書く。

# GAE試行Index
- [GAE/Java8試行（その0：「App Engineについて」）](https://qiita.com/sky0621/items/6175d578d0521858a944)
- [GAE/Java8試行（その1：「Java8でWebアプリ作ってデプロイ」）](https://qiita.com/sky0621/items/8437da4e96bffef69250)
- [GAE/Java8試行（その2：「Javaアプリ解説」）](https://qiita.com/sky0621/items/65ce0406fb895f547ae5)
- [GAE/Java8試行（その3：「Javaアプリテストコード解説」）](https://qiita.com/sky0621/items/874c8b6462fdc5a0829d)
- [GAE/Java8試行（その4：「Datastoreへのアクセスロジック」）](https://qiita.com/sky0621/items/c150f6e66320e240add8)
- [GAE/Java8試行（その5：「ローカル開発用コンソール」）](https://qiita.com/sky0621/items/70a17e243d6e5175ed20)
- [GAE/Java8試行（その6：「デプロイ失敗」）](https://qiita.com/sky0621/items/d89c7473fd5207edcfd5)
- [GAE/Java8試行（その7：「ウォームアップリクエスト(ServletContextListener使用版)」）](https://qiita.com/sky0621/items/33fb5de9a228a77338e8)
- [GAE/Java8試行（その8：「Cloud Endpoints Frameworks」）](https://qiita.com/sky0621/items/c0119c0855b596ae4c57)

# 開発環境
### # 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)
```
### # IDE
みんな大好き[IntelliJ IDEA](https://www.jetbrains.com/idea/)

# 本題

## GAEデプロイ失敗

```
$ mvn appengine:deploy
[INFO] Scanning for projects...
　　　〜〜〜〜
[INFO] GCLOUD: 
[INFO] GCLOUD: Beginning interaction for module default...
[INFO] GCLOUD: 0% Warning: Google App Engine Java 7 runtime is deprecated.
[INFO] GCLOUD: 0% Warning: See https://cloud.google.com/appengine/docs/deprecations/java7
[INFO] GCLOUD: Unable to stage app: Class file is Java 8 but max supported is Java 7: /work/src/java/github.com/sky0621/java-webapi-for-gae-study/com.example.sky0621.fs/target/com.example.sky0621.fs-1.0-SNAPSHOT/WEB-INF/classes/com/example/sky0621/fs/BookSaver.class
[INFO] GCLOUD: Please see the logs [/tmp/appcfg5667381128099465326.log] for further information.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.862 s
[INFO] Finished at: 2018-11-06T09:17:14+09:00
[INFO] Final Memory: 22M/443M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.google.cloud.tools:appengine-maven-plugin:1.3.1:deploy (default-cli) on project com.example.sky0621.fs: Execution default-cli of goal com.google.cloud.tools:appengine-maven-plugin:1.3.1:deploy failed: Non zero exit: 1 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
```

## 原因

とりあえず「`ERROR`」の行では原因がわからなかったので「`mvn -X appengine:deploy`」でスタックトレースを確認しようとしたのだけど、ふと、「`INFO`」の行の「`Unable to stage app: Class file is Java 8 but max supported is Java 7`」というのが目に止まった。
「Java8で書かれたソースをデプロイしようとしているが、サポートしているのはJava7まで」？
いや、[前回](https://qiita.com/sky0621/items/c0119c0855b596ae4c57#mavenプロジェクト生成)、「`-Djava8=true`」付きでMavenプロジェクトビルドしたんだけど・・・。

一応、「`appengine-web.xml`」の中を確認してみる。

```
$ pwd
/work/src/java/github.com/sky0621/java-webapi-for-gae-study/com.example.sky0621.fs
$
$ tree
|　〜〜〜
├── src
    ├── main
        └── webapp
            └── WEB-INF
                ├── appengine-web.xml
```

```xml
$ cat src/main/webapp/WEB-INF/appengine-web.xml 
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <threadsafe>true</threadsafe>

    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>
</appengine-web-app>
```

あ、「`<runtime>java8</runtime>`」が入ってない・・・。
なんでだろう・・・。
たぶん、これが原因だな。

## 解決

修正。

```xml
$ cat src/main/webapp/WEB-INF/appengine-web.xml 
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <threadsafe>true</threadsafe>
    <runtime>java8</runtime>
    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>
</appengine-web-app>
```

そして、デプロイ。

```
$ mvn appengine:deploy
[INFO] Scanning for projects...
[INFO] 
　　〜〜〜〜
[INFO] GCLOUD:   $ gcloud app browse
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 37.725 s
[INFO] Finished at: 2018-11-06T09:32:09+09:00
[INFO] Final Memory: 20M/391M
[INFO] ------------------------------------------------------------------------
```

成功。
う〜ん、なんでJava8ランタイムが付かなかったんだろう・・・。