Herokuにデプロイしたアプリの更新で「Application error」


# 概要

既にHerokuへデプロイしたアプリケーションで修正を行い、更新された内容をHerokuに反映したところ、アプリケーションが実行できないという事象が発生しました。

アプリケーションはspring-boot用いて作成し、mavenでビルドをしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/be36dcaa-0c3a-9f45-7dac-22776cefc46d.png)

上のような画面が表示され、「heroku logs --tail」をターミナルで打つと下記のログが出ていました。
どうやらアプリ実行用のjarファイルにアクセスできないことによりエラーが起きているようです。


```
2021-04-21T03:49:43.595393+00:00 app[web.1]: Error: Unable to access jarfile target/Snitch-0.0.1-SNAPSHOT.jar
2021-04-21T03:49:43.654208+00:00 heroku[web.1]: Process exited with status 1
2021-04-21T03:49:43.862559+00:00 heroku[web.1]: State changed from starting to crashed
2021-04-21T03:49:46.024338+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=snitch1.herokuapp.com 
```

# 環境　

OS: macOS Big Sur 11.2.3
JDK:14.0.1
Spring Boot 2.3.3
maven
eclipse

# 結論(原因)

####jarファイルがコミット対象に含まれていなかった。


Heroku上でアプリケーションを実行する場合は、下記の内容が書いてある「Procfile」というHeroku上で実行するコマンドを定義したファイルをルートディレクトリに置く必要があります。

```
web: java -Dserver.port=$PORT -jar target/Snitch-0.0.1-SNAPSHOT.jar
```

ファイルの内容を見ていただければわかるのですが、**「target」というディレクトリの配下にあるjarファイルを実行する**ということが書かれており、Heroku上にこのjarファイルがないとアプリは当然実行できません。

この事象にハマった時、筆者はHeroku上にjarファイルはあるに決まっていると思い込んでいました。

# 対処法

では、Eclipseとターミナルを使って改めてデプロイをしていきます。

括弧内はターミナルなどでコマンドによる操作を行う方のために書いているものです。

## ①Maven clean(mvn clean)
targetディレクトリを削除します。

プロジェクトを右クリック>「実行」>「4 maven clean」をクリック。


![スクリーンショット 2021-04-23 11.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/4d5cc3ea-d861-52d0-e3ac-8706b8be6f11.png)

## ②Maven ビルド(mvn package)
jarファイルを生成します。

プロジェクトを右クリック>「実行」>「8 maven ビルド」をクリック。

![スクリーンショット 2021-04-23 12.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/084b12ac-852e-35f2-5658-606f248c7476.png)

## ③jarファイルを「git add」
生成したjarファイルを「git add」します。

ターミナルでコマンドを実行してみると、**なんと「.gitignore」ファイル上でコミット対象に含めないようになっていました。**

これにより、
Heroku上でjarファイルは存在しないことによるアプリの実行エラーが発生していたことがわかりました。

```
$ git add target/Snitch-0.0.1-SNAPSHOT.jar
The following paths are ignored by one of your .gitignore files:
target/Snitch-0.0.1-SNAPSHOT.jar
Use -f if you really want to add them.
$ git add -f target/Snitch-0.0.1-SNAPSHOT.jar
```

「git add -f」で強制的にjarファイルをコミット対象に追加しました。

「git status」でjarファイルがコミット対象に含まれていることを確認し、コミットします。

```
$ git status
On branch Heroku
Your branch is up to date with 'origin/Heroku'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   target/Snitch-0.0.1-SNAPSHOT.jar

$ git commit -a -m "add target/Snitch-0.0.1-SNAPSHOT.jar"
[Heroku f752287] add target/Snitch-0.0.1-SNAPSHOT.jar
 1 file changed, 236363 insertions(+)
 create mode 100755 target/Snitch-0.0.1-SNAPSHOT.jar
```

## ④Herokuにデプロイ
Herokuにデプロイします。

```
$ git push heroku Heroku:main
```

**※補足**
筆者の環境では、デフォルトブランチ名は「master」ではなく**「main」**で、
メインブランチではなく**「Heroku」**というブランチからpushしているので上記のコマンドになりました。
デフォルトブランチ名と作業ブランチが「master」であれば「git push heroku master」です。

参考

https://devcenter.heroku.com/ja/articles/git

デプロイが完了したところでアプリを開いてみます。

![スクリーンショット 2021-04-23 12.22.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/f16066e9-a567-3a78-e9fe-ce35ee1be569.png)

うまくいきました！！


# 最後に
更新される方だけでなく、初めてデプロイされる方の参考にもなれば幸いです。