Heroku初心者がJavaで作成したWebアプリをGitHub連携でデプロイする時つまずいた4つのこと

<h1>きっかけ</h1>
自分で作成したWebアプリケーションをGitHubに置いていたが、
「やっぱり動く状態で公開したいよね！」
という気持ちが芽生えたのがきっかけ。

いろいろググって
「どうやらHerokuというものでいけそうだ」
ということがわかったので、勉強がてらデプロイしようと思った。

ソース：
https://github.com/ShandyGaffLover/sample001

<h1>前提</h1>
・Heroku初めて
・Java,Git,Mavenは経験者
・GitHubアカウント作成済み

<h1>やったこと</h1>
Herokuアカウント作成⇒GitHub連携
まではググりながら割とすんなりできた。

参考にした記事は以下：
無料でWebアプリケーションを公開できるHerokuをやってみた - Qiita
https://qiita.com/fkooo/items/0365b50d4534a236dcb2

Heroku使い方メモ（Java） - Qiita
https://qiita.com/opengl-8080/items/9dc9243c4e68cd0674f8


<h1>つまずいたこと</h1>

<h2>①「アプリの言語がわからない」と言われてビルドされない</h2>
<h3>現象</h3>
連携するリポジトリとデプロイするブランチを選択後、「Deploy Branch」ボタンを押下すると、「No default language could be detected for this app.」と表示された。

![builderror.png](https://qiita-image-store.s3.amazonaws.com/0/322008/93fa8895-18ff-1b42-4db2-25844fdd5196.png)

<h3>原因</h3>
Buildpackの設定がなされていないため。

<h3>対応</h3>
「Settings」タブのページ下方から「Add buildpack」を押下し、「heroku/java」を選択し追加する。

<h3>結果</h3>
もう一度「Deploy Branch」ボタンを押下すると、以下のように依然ビルドエラーとなった。

![wherepomis.png](https://qiita-image-store.s3.amazonaws.com/0/322008/f3f31231-30ed-b7c5-35ff-c75a652d976a.png)


<h2>②「pom.xmlが見つからない」と言われてビルドされない</h2>
<h3>現象</h3>
①の対応後、再び「Deploy Branch」ボタンを押下すると、「Could not find a pom.xml file! Please check that it exists and is committed to Git.」と表示された。

<h3>原因</h3>
レポジトリ直下にpom.xmlが存在しないため。

自分は最初trainingレポジトリの下にsample001プロジェクトを作成していたので、pom.xmlはtraining/sample001/pom.xmlという位置にあった。
どうやらこの位置だとHerokuにデプロイできないようだ。

※類例があった。
Heroku:Buildpackエラーでハマった - Qiita
https://qiita.com/arekore0/items/eae550bdbcc78eeac082

<h3>対応</h3>
新規レポジトリsample001を作成し、その直下にpom.xmlを配置しソースを移動した。

<h3>結果</h3>
もう一度「Deploy Branch」ボタンを押下すると、以下のようにビルド成功となった。やったね！

![buildsuccess.png](https://qiita-image-store.s3.amazonaws.com/0/322008/3806e4da-5a60-b3b2-66a2-4dc170e8200f.png)

...と思ったのも束の間、

![apperror.png](https://qiita-image-store.s3.amazonaws.com/0/322008/7147b541-4dc2-9820-d0fb-7ef3eddaf975.png)

URLにアクセスするとApplication Errorが表示されている...。

<h2>③デプロイ後、Webプロセスが実行されていない</h2>
<h3>現象</h3>
デプロイに成功後、「View」ボタンを押下してアプリケーションURLにアクセスすると、ApplicationErrorを通知する画面が表示される。
ログを参照すると以下のように表示される。


```
2018-12-06T07:09:36.166348+00:00 heroku[router]: at=error code=H14 desc="No web processes running" 
```

<h3>原因</h3>
Procfileが作成されていない状態で、Webアプリケーションが実行されていないため。[^1]
[^1]: この日本語が技術的に正しいかどうかあまり自信がありません。どなたかProcfileとデプロイ資産の関係について詳しい方、もし誤りがあればご指摘いただけると幸いです。

<h3>対応</h3>
以下を参考に、①Procfileを作成し、②pom.xmlのpluginにwebapp-runnerを追記する。
Deploying Tomcat-based Java Web Applications with Webapp Runner | Heroku Dev Center
https://devcenter.heroku.com/articles/java-webapp-runner#deploy-your-application-to-heroku

<h3>結果</h3>
![apperror.png](https://qiita-image-store.s3.amazonaws.com/0/322008/7147b541-4dc2-9820-d0fb-7ef3eddaf975.png)

依然としてApplication Errorが表示されている。ええ...なんで...。

<h2>④「warファイルが存在しない」とログに表示される</h2>
<h3>現象</h3>
③の対応後、デプロイに成功し「View」ボタンを押下してアプリケーションURLにアクセスすると、ApplicationErrorを通知する画面が表示される。
ログを参照すると以下のように表示される。

```
2018-12-06T10:51:25.163976+00:00 app[web.1]: The specified path "target/*.war" does not exist.
```

この原因が最初わからなくてめちゃくちゃ焦った[^2]のだが、たいていそういう場合は往々にして原因はしょぼいのである。

<h3>原因</h3>
pom.xmlのpackagingが未記載であったため。

<h3>対応</h3>
pom.xmlのpackagingに"war"を指定する。

<h3>結果</h3>
デプロイ成功！


<h1>まとめ</h1>
Herokuを初めて利用する際は以下に注意すればいいと思う。
①Buildpackの設定が必要。
②Javaの場合レポジトリ直下にpom.xmlを配置する必要がある。
③Procfileが必要。

pom.xmlの<packaging>に"war"を指定し忘れた件は私があほでした。すみません。[^2]
[^2]: ローカルのTomcatだと動作したのはなぜなのだろう。