JavaとGradleを用いて作成したLINE BOTをherokuにデプロイする + 動作確認時にcode=H10エラーが発生時の対応
はじめに
本記事は Java(Spring boot)+ Gradle で LINE BOT を作成するでローカル環境での動作確認まで完了した LINE BOT を heroku にデプロイして動作確認する手順を紹介します。その過程でエラーが発生し詰まってしまったので、同じような事象に悩んでいる方の参考になればと思い調査内容と解決方法を紹介します。
手順
heroku アカウントの作成
heroku アカウントを持っていなければHeroku | Sign upでアカウント作成を行なってください。
heroku アプリの作成
アカウント作成が完了したら、右の New タブから Create new app を選択します。
アプリ名を記入して Create app を選択します。
これで heroku アプリが作成されます。
heroku への commit・push
下記コマンドを実行して heroku へリモートリポジトリを追加し、commit と push を行います。
git init
heroku git:remote -a java-line-bot-sample
git add .
git commit -am “init commit”
git push heroku master
動作確認
heroku へのデプロイが完了したらこちらのページを参考にして作業を行います。作業が完了したら、Webhook 設定の検証ボタンをクリックして動作確認を行います。
検証をクリックし、成功したら無事 LINEBOT が動作しています。
もし動作確認で成功したらここで終了です。お疲れ様でした!
実行エラーのトラブルシューティング
事象
もし、ビルドまでは成功したけど検証ボタンをクリックすると 503 エラーが発生して動作確認に失敗する方がいたら自分も同じエラーでハマったので参考にしてください。
エラーログ確認
まず何が起きているのか確認するため
heroku logs
で確認します。すると下記のログが表示されます。
2021-12-26T17:22:41.840673+00:00 heroku[web.1]: State changed from crashed to starting
2021-12-26T17:22:44.653786+00:00 heroku[web.1]: Starting process with command `java -Dserver.port=36644 $JAVA_OPTS -jar build/libs/*.jar`
2021-12-26T17:22:45.451048+00:00 app[web.1]: Create a Procfile to customize the command used to run this process: https://devcenter.heroku.com/articles/procfile
2021-12-26T17:22:45.465029+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them.
2021-12-26T17:22:45.468209+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8
2021-12-26T17:22:45.544810+00:00 app[web.1]: no main manifest attribute, in build/libs/java-line-bot-sample-0.0.1-SNAPSHOT-plain.jar
2021-12-26T17:22:45.667405+00:00 heroku[web.1]: Process exited with status 1
2021-12-26T17:22:45.804769+00:00 heroku[web.1]: State changed from starting to crashed
2021-12-26T17:22:47.000000+00:00 app[api]: Build succeeded
2021-12-26T17:34:36.512761+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=POST path="/callback" host=java-line-bot-sample.herokuapp.com request_id=f6aa25ae-35b7-41e8-9dff-8d3b729958c5 fwd="147.92.149.167" dyno= connect= service= status=503 bytes= protocol=https
このログから、java コマンドによって build/libs/ 配下の jar ファイルが実行されビルドまで成功しているが、アプリの起動に失敗しており code=H10 desc=”App crashed” というログが出力されていることが分かります。
原因
Spring Boot Gradle プラグインリファレンスガイドによると Gradle の jar タスクでは実行可能アーカイブとプレーンアーカイブの 2 種類を作成することができます。そして、デフォルトで生成されるのはプレーンアーカイブとなっています。(これは Gradle2.5 以降の仕様になっています。)
つまりデフォルトの状態だと、実行可能ではないプレーンアーカイブ(末尾が plain-jar のファイル)が生成されており、それを実行しようとしていたことがエラーの原因になります。
エラーログをもう一度確認すると、確かに末尾が plain-jar のプレーンアーカイブを実行しようとしています。
2021-12-26T17:22:45.544810+00:00 app[web.1]: no main manifest attribute, in build/libs/java-line-bot-sample-0.0.1-SNAPSHOT-plain.jar
対処方法
プレーンアーカイブは必要ないので、Spring Boot Gradle プラグインリファレンスガイドに従い build.gradle
に下記を追記します。
jar {
manifest {
enabled = false
}
}
この修正を反映させて改めて Heroku に push して動作確認すると成功しました。
もし、私と同様の内容で詰まった方の参考になれば幸いです。
Discussion