TomcatベースのEclipseプロジェクトをHerokuにデプロイする

# まえがき
HerokuでのJavaアプリケーションの公開方法は多種多様あるようですが、オーソドックスにローカルでTomcatを使って開発していた際に、本番環境はHerokuで、となった場合の対応メモです。
# 事前準備
・Pleiades All in One Eclipse リリース 2018-09（Eclipse SimRel 2018‑09に対応）
・Heroku
・Eclipseで動的Webプロジェクト（Dynamic Web Project）で"Hello World on Heroku!!"（まだローカルだけど）が表示されるところまでは確認。
![devtest_heroku01.png](https://qiita-image-store.s3.amazonaws.com/0/177419/b1be4a28-e005-4e8e-acc3-e17c14991ae3.png)
# Heroku側の下準備
アプリケーション名を先に確保したかったのでこちらの手順が先に来ていますが、この後やっているMavenプロジェクトへの変換後でも良いです。
今回は以下のようにdevtest-herokuという名前で作成しました。
![devtest_heroku02.png](https://qiita-image-store.s3.amazonaws.com/0/177419/0152c630-3aaa-cf66-c68d-d49e8b19ef45.png)
次にSettingタブへ移動し、
![devtest_heroku03.png](https://qiita-image-store.s3.amazonaws.com/0/177419/407b1688-e4cb-defc-1b72-0c45f2aba611.png)
ビルドパックを指定します。
![devtest_heroku04.png](https://qiita-image-store.s3.amazonaws.com/0/177419/4e557642-c6ec-8acc-cce1-941863691c38.png)
今回はJavaです。
![devtest_heroku05.png](https://qiita-image-store.s3.amazonaws.com/0/177419/345eaea3-9493-a551-8069-4cb8095ec902.png)
追加されました。
![devtest_heroku06.png](https://qiita-image-store.s3.amazonaws.com/0/177419/c79a59e8-d113-8676-f436-825457711f39.png)
# Maveプロジェクトへの変換
と言っても変換ではなくてここでは新規作成⇒コピーの方法を取ります。
まずはMavenプロジェクトの新規作成です。
devtest-herokuという名前にしました。
![devtest_heroku07.png](https://qiita-image-store.s3.amazonaws.com/0/177419/6dc846bd-4c97-2ada-6281-ce0043399475.png)
アーキテクチャタイプは「maven-archetype-webapp」を選択します。
![devtest_heroku08.png](https://qiita-image-store.s3.amazonaws.com/0/177419/92de3c7b-1486-26d7-9096-97abc7afb9e1.png)
各種パラメータはこんな感じで。
![devtest_heroku09.png](https://qiita-image-store.s3.amazonaws.com/0/177419/02cdbc1d-7444-ed52-e47f-5f5c9e07cc23.png)
作成後、いくつか手直しを行います。
### ビルドパス補正
![devtest_heroku10.png](https://qiita-image-store.s3.amazonaws.com/0/177419/3aa885c9-c934-81d9-f6d3-19924137c46e.png)
プロジェクトフォルダ/src/main/javaとプロジェクトフォルダ/src/test/javaが無いよ、と言われるので、物理的に作成します。Windowsならエクスプローラ上で結構です。
### JREの変更
![devtest_heroku11.png](https://qiita-image-store.s3.amazonaws.com/0/177419/cdc442e6-465f-044d-5e1e-e31b6a85df64.png)
Mavenプロジェクトを作るとデフォルトはJava5のようなので、Java8を選択します。
### サーバーランタイムの追加
![devtest_heroku12.png](https://qiita-image-store.s3.amazonaws.com/0/177419/748d50a4-1aa3-7f9e-7f3a-a12d0fe7e68e.png)
![devtest_heroku13.png](https://qiita-image-store.s3.amazonaws.com/0/177419/e119265b-3b7b-5056-6e91-4abb4a567bd9.png)
![devtest_heroku14.png](https://qiita-image-store.s3.amazonaws.com/0/177419/6d9f5d58-e992-87e5-dd46-204758b5a252.png)
もしかしたらこの手順は不要かもしれませんが、私の環境ではTomcat8を利用しているのでそのランタイムを追加しました。
### プロジェクト・ファセットの変更
こちらもJava5になっているので、Java8に変更します。
![devtest_heroku15.png](https://qiita-image-store.s3.amazonaws.com/0/177419/19298da8-7265-df34-7870-87f815e67020.png)
![devtest_heroku16.png](https://qiita-image-store.s3.amazonaws.com/0/177419/9c3b2bcb-8b2a-3de1-ed47-e43e0c9ff132.png)
### ソースコードのコピー
package：dev.localを作成後、写真のようにファイルをコピーします。
![devtest_heroku17.png](https://qiita-image-store.s3.amazonaws.com/0/177419/a3d18970-6a46-8090-f263-49488e60a8b4.png)
### pom.xmlの修正
Mavenプロジェクトを作成した段階で以下の内容のファイルが出来上がっていると思いますが、

```xml:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>dev.local</groupId>
  <artifactId>devtest-heroku</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>devtest-heroku Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>devtest-heroku</finalName>
  </build>
</project>
```

以下のように
・dependenciesにサーブレットのdependencyを追加
・buildの下のpluginsを追加（Tomcatのwebapp-runner.jarを追加）
しました。

```xml:pom.xml（修正後）
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>dev.local</groupId>
  <artifactId>devtest-heroku</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>devtest-heroku Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>devtest-heroku</finalName>
    <plugins>
	    <plugin>
		    <groupId>org.apache.maven.plugins</groupId>
		    <artifactId>maven-dependency-plugin</artifactId>
	        <executions>
	        	<execution>
	            	<phase>package</phase>
	            	<goals><goal>copy</goal></goals>
	            	<configuration>
	                    <artifactItems>
	                        <artifactItem>
	                            <groupId>com.github.jsimone</groupId>
	                            <artifactId>webapp-runner</artifactId>
	                            <version>9.0.11.0</version>
	                            <destFileName>webapp-runner.jar</destFileName>
	                        </artifactItem>
	                    </artifactItems>
	                </configuration>
	            </execution>
	        </executions>
        </plugin>
    </plugins>
  </build>
</project>
```

### Procfileの作成
Heroku側でのWebappのスタート時に実行される内容だそうで、中身はJavaコマンドになります。
こちらはHerokuデプロイ前に作成されればOKです。プロジェクト直下に作成します。

```sh:Procfile
web: java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --port $PORT target/*.war
```

### Mavenプロジェクトのビルド
ビルド設定になります。
pom.xmlを右クリック⇒実行⇒Mavenビルドを選択すると、下記の画面が出ますので、
赤線・赤枠内のように設定します。
![devtest_heroku18.png](https://qiita-image-store.s3.amazonaws.com/0/177419/065fedb1-faef-1914-b0cd-9625624c8684.png)
実行してみて"BUILD SUCCESS"が出ていれば、一旦終了です。
![devtest_heroku19.png](https://qiita-image-store.s3.amazonaws.com/0/177419/f5ddff3a-0149-7bcf-9ec5-3b4ba0fcfdbe.png)

### 試しにTomcatに載せてみる
ビルドが終わったらwarファイルが作成されていますので、試しにローカルのTomcatに載せてみます。
![devtest_heroku20.png](https://qiita-image-store.s3.amazonaws.com/0/177419/c54e119c-60fa-c7bc-8e1d-6902254aac0c.png)
ブラウザから呼んでみると、無事に表示されました。
![devtest_heroku21.png](https://qiita-image-store.s3.amazonaws.com/0/177419/4352de57-b0b1-a2ed-9634-882ff046ccb4.png)

# Herokuへのデプロイ
ここからはHerokuの管理コンソールのdeployタブにある手順に従います。
![devtest_heroku22.png](https://qiita-image-store.s3.amazonaws.com/0/177419/0a17a153-4b74-28ea-b824-45fb45d7238f.png)
git push heroku masterが終わったら、heroku psコマンドを叩いてみて、
Webappの状況を確認します。
![devtest_heroku23.png](https://qiita-image-store.s3.amazonaws.com/0/177419/d5ab8da8-4df8-d651-d4b4-86bfa60b1520.png)
ブラウザでアクセスして、以下のように表示されれば完成です。
![devtest_heroku24.png](https://qiita-image-store.s3.amazonaws.com/0/177419/ae134633-fb95-fb8f-3269-44893f48abab.png)

# 終わりに
拙い手順を最後まで参照頂きありがとうございます。
Mavenプロジェクトを新規作成せずとも直接変換可能なので、そちらでやるともっと効率的かもしれません。
各種バージョンが変わればまた動きも変わるでしょうから、あくまでも現時点での手順、となるかと思います。
EclipseのHerokuプラグインとかあっても良さそうですけどね。