eclipseで作成した動的Webプロジェクト(Java 1.8,Tomcat 8.5)をHerokuにデプロイしてみる

前置き

暇を持て余していてせっかくなので、
無料で利用できるHerokuにeclipseで作成したWebアプリをデプロイしてみる。

下準備

まず公式のチュートリアルはやっとくべきだと思う devcenter.heroku.com

あとはいろんな方が始め方をまとめてるのでそちらを参照。
自分は下記の記事を参考にした。
Heroku用開発ツールのセットアップまでは同じようにやる。
web.plus-idea.net

ひな型アプリの入手

Tomcatベースのアプリを動かすためのひな型を下記から入手する。

GitHub - heroku/devcenter-embedded-tomcat

$ git clone git@github.com:heroku/devcenter-embedded-tomcat.git

必要に応じて追記・修正をする

pom.xml

ひな型落としてくるとJavaのバージョン1.5でビルドになってるので
Java1.8を明記したり文字コードをセットしたり。
dependenciesに使用するjarファイルを追記する。

  <properties>
    <tomcat.version>8.5.38</tomcat.version>
    <!-- ここから追記 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!-- ここまで -->
  </properties>
  <dependencies>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jasper</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jasper-el</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jsp-api</artifactId>
        <version>${tomcat.version}</version>
    </dependency>

    <!-- ここから追記 -->
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>42.2.12</version>
    </dependency>
    <!-- ここまで -->
  </dependencies>
WebContentフォルダの中身

動的WebプロジェクトのWebContentフォルダの中身、
HTML,CSS,JSP,JSなんかのファイルはsrc/main/webappフォルダに移す。
Javaソースの配置は動的Webプロジェクトとほぼ変わらず。
ディレクトリの階層はちょっと違うけど迷うことはない)
参考として自分のクソコードを晒す。

Procfile.windows

必須でない、かつOSがWindowsのひと限定。
ローカルで動作確認するときに便利なので作っといてもよいかと。
ファイルの中身は下記のとおり。配置場所はプロジェクト直下でOK。

web: target\bin\webapp.bat
Database.java

こちらも必須でない、
けどPostgreSQL使うとき便利なので載せとく。
PostgreSQLのURL直書きしなくても
System.getenv("DATABASE_URL")で取得できる。
ソース元は他の方の記事から。URLは失念してしまいました。

package util;

import java.net.URI;
import java.net.URISyntaxException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * DB接続のクラス
 * @author
 *
 */
public class Database {

    public static Connection getConnection() throws SQLException {
        String databaseUrl = System.getenv("DATABASE_URL");

        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            throw new IllegalStateException(e);
        }
        try {
            URI uri = new URI(databaseUrl);
            String host = uri.getHost();
            int port = uri.getPort();
            if (port > 0) {
                host += ":" + port;
            }
            String db = uri.getPath();
            String username = uri.getUserInfo();
            String password = null;
            int idx = username.indexOf(":");
            if (idx != -1) {
                password = username.substring(idx + 1);
                username = username.substring(0, idx);
            }
            Connection con = DriverManager.getConnection("jdbc:postgresql://" + host + db, username, password);
            return con;
        } catch (URISyntaxException e) {
            throw new IllegalStateException(e);
        }

    }
}

Mavenでビルドする

必要なリソースを全部配置したら、
コンソールでプロジェクト直下に移動して、Mavenビルドを実行

$ mvn clean install

gitコミットする

warファイルが作成できたらgitコミットする

# 初期化
$ git init
# コミットするソースの追加
$ git add .
# コミット
$ git commit -m "コメント入力"

# コミットしてないファイルないか確認
$ git status

herokuにプッシュする

herokuコマンドの実行にはチュートリアルとか参考記事で出てきた
Heroku Toolbeltが必要です。

herokuにプッシュしてアプリ起動したら、下記のURLで確認できる
https://自分で設定したアプリ名.herokuapp.com/

# herokuにプッシュ先のリポジトリを作成
# アプリ名は一意なURLとなる必要ある、ほかの人がすでに使ってたらエラー
# アプリ名省略した場合(heroku createで実行)、ランダムなURLが振られる
$ heroku create (アプリ名)

# herokuへプッシュ
$ git push heroku master

# プッシュ後、アプリ起動してるか確認
$ heroku ps

 # ログの確認
$ heroku log --tail

# アプリ名の変更
$ heroku apps:rename hogehoge

# リモートリポジトリの一覧を表示
$ git remote -v

# リモートリポジトリのURLを変更
$ git remote set-url heroku {new url}

PostgreSQLのアドオン追加

PostgreSQL使用する場合、heroku上にPostgresSQLのアドオン追加が必要。
アドオン追加は簡単。

# アドオン(PostgreSQL)の追加
$ heroku addons:add heroku-postgresql

# DB接続先の確認
$ heroku config

#DB接続
$ heroku pg:psql

ローカルで動かすとき

herokuにプッシュする前にローカルで確認する場合は
下記のコマンドを実行
アプリのデフォルトのポートは下記
http://localhost:5000/

# macの場合
$ heroku local web
# windowsの場合(設定によって文字化けするけどちゃんと起動してる)
$ heroku local web -f Procfile.windows