Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

まえがき

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

Heroku側の下準備

アプリケーション名を先に確保したかったのでこちらの手順が先に来ていますが、この後やっているMavenプロジェクトへの変換後でも良いです。
今回は以下のようにdevtest-herokuという名前で作成しました。
devtest_heroku02.png
次にSettingタブへ移動し、
devtest_heroku03.png
ビルドパックを指定します。
devtest_heroku04.png
今回はJavaです。
devtest_heroku05.png
追加されました。
devtest_heroku06.png

Maveプロジェクトへの変換

と言っても変換ではなくてここでは新規作成⇒コピーの方法を取ります。
まずはMavenプロジェクトの新規作成です。
devtest-herokuという名前にしました。
devtest_heroku07.png
アーキテクチャタイプは「maven-archetype-webapp」を選択します。
devtest_heroku08.png
各種パラメータはこんな感じで。
devtest_heroku09.png
作成後、いくつか手直しを行います。

ビルドパス補正

devtest_heroku10.png
プロジェクトフォルダ/src/main/javaとプロジェクトフォルダ/src/test/javaが無いよ、と言われるので、物理的に作成します。Windowsならエクスプローラ上で結構です。

JREの変更

devtest_heroku11.png
Mavenプロジェクトを作るとデフォルトはJava5のようなので、Java8を選択します。

サーバーランタイムの追加

devtest_heroku12.png
devtest_heroku13.png
devtest_heroku14.png
もしかしたらこの手順は不要かもしれませんが、私の環境ではTomcat8を利用しているのでそのランタイムを追加しました。

プロジェクト・ファセットの変更

こちらもJava5になっているので、Java8に変更します。
devtest_heroku15.png
devtest_heroku16.png

ソースコードのコピー

package:dev.localを作成後、写真のようにファイルをコピーします。
devtest_heroku17.png

pom.xmlの修正

Mavenプロジェクトを作成した段階で以下の内容のファイルが出来上がっていると思いますが、

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を追加)
しました。

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です。プロジェクト直下に作成します。

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

Mavenプロジェクトのビルド

ビルド設定になります。
pom.xmlを右クリック⇒実行⇒Mavenビルドを選択すると、下記の画面が出ますので、
赤線・赤枠内のように設定します。
devtest_heroku18.png
実行してみて"BUILD SUCCESS"が出ていれば、一旦終了です。
devtest_heroku19.png

試しにTomcatに載せてみる

ビルドが終わったらwarファイルが作成されていますので、試しにローカルのTomcatに載せてみます。
devtest_heroku20.png
ブラウザから呼んでみると、無事に表示されました。
devtest_heroku21.png

Herokuへのデプロイ

ここからはHerokuの管理コンソールのdeployタブにある手順に従います。
devtest_heroku22.png
git push heroku masterが終わったら、heroku psコマンドを叩いてみて、
Webappの状況を確認します。
devtest_heroku23.png
ブラウザでアクセスして、以下のように表示されれば完成です。
devtest_heroku24.png

終わりに

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

norihiko_tokudaiji
なんちゃってエンジニアです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした