未来エンジニア養成所Blog

プログラミングを皆に楽しんでもらうための情報をお届けします。

Java Servlet のプログラムを Heroku へデプロイしてみる。

今回はデプロイのお試しとして、Java Servlet で作成したプログラムを Heroku へデプロイしてみたいと思います。


Heroku とは

Heroku とは、PaaS(Platform as a Service) と呼ばれるサービスで、サーバコンピュータを提供してくれるサービスになっています。

作成したWebアプリケーションを Heroku にデプロイ(アップロード)することで、自身で作成したWebアプリケーションをWebサービスとして一般に公開することができます。

Heroku には有料プランと無料プランがありますが、本格的にWebサービスとして公開するのでなければ無料プランで十分でしょう。

ちなみに、無料プランには下記のような制限が設けられています。

  • アカウント毎に、アプリケーションは月に550時間までの稼働時間が割り当てられる
  • アカウントにクレジットカードを紐付けると1000時間に増える
  • 公開しているアプリケーションに、30分間アクセスがないと、スリープモードに移行する


Webアプリケーションの準備

何はともあれ、デプロイするためのWebアプリケーションが必要なので、それを作成します。

今回は単純に「Hello World!」とブラウザ上に表示するだけのアプリにします。(データベースは使用しません。データベースを使用したバージョンはまた別でやってみたいと思います。)


開発環境は、

OS : macOS Big Sur(バージョン 11.1)
IDE : Eclipse2020-06 (4.16.0)
JDK : SE8

です。


プログラムは「Hello World!」を表示するだけですので、

package testservlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloWorldServlet
 */
@WebServlet("/helloworld")
public class HelloWorldServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
        out.println("<!DOCTYPE html>");
        out.println("<html lang=\"ja\">");
        out.println("<head>");
        out.println("<meta charset=\"UTF-8\">");
        out.println("<title>Servlet Test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World!</h1>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }

}

となっています。

実行すると下記のような表示になるアプリケーションです。


これでWebアプリケーションとしては完成しているのですが、Heroku へデプロイするためにはMavenプロジェクトにしておく必要があります。

Mavenプロジェクトへ変更するためには、Eclipseでプロジェクトを右クリックし、「構成」→「Maven プロジェクトへ変換」を選ぶだけです。


選択すると下記のような画面が表示されますが、とりあえずデフォルトのまま「完了」にします。


プロジェクトの中に「pom.xml」というファイルが作成されればOKです。


Heroku へのアカウント登録

Heroku を利用するために、まずはアカウントを作成します。

Heroku のトップページから新規アカウント登録ページに遷移します。

クラウド・アプリケーション・プラットフォーム | Heroku


「無料で新規登録」をクリックすると、下記のような画面になりますので、必要事項を入力して「無料アカウント作成」ボタンを押します。


登録を行うと、登録したメールアドレスに確認用のメールが届きますので、 メールに記載されているリンクを踏んで認証を行います。

認証が完了すると次はパスワード設定画面へ遷移します。パスワード設定後、ダッシュボード画面に遷移してHerokuのアカウント作成は完了です。


Heroku CLIツールのインストール

もう一つ準備する必要があります。 HerokuにWebアプリケーションをデプロイするには、Herokuのコマンドラインツールをインストールする必要があります。

Getting Started on Heroku with Java | Heroku Dev Center

今回はmacを利用していますのでbrewを使ってインストールします。

$ brew install heroku/brew/heroku


デプロイツールをインストール

これはコマンドを入力するだけです。

$ heroku plugins:install heroku-cli-deploy


いよいよデプロイ

これから作成したWebアプリケーションをデプロイしていきます。

Herokuへログイン

まずは、ターミナル上で、Herokuにログインします。

$ heroku login -i

Enter your Heroku credentials.
Email: Herokuに登録したメールアドレスを入力
Password: Herokuに登録したパスワードを入力


Herokuにログイン成功すると以下のメッセージが表示されます。

Logged in as Herokuに登録したメールアドレス


Heroku上に自分のアプリケーション用の領域を名前をつけて確保する

Herokuでは他のユーザがすでに登録している領域の名前と同じものを登録できないため、独自の名前で領域を作成します。

今回は「hello-world-norris」という名前で作成します。

$ heroku create hello-world-norris
Creating ⬢ hello-world-norris... done
https://hello-world-norris.herokuapp.com/ | https://git.heroku.com/hello-world-norris.git


サーバインスタンスのタイムゾーンを設定

念のためサーバインスタンスのタイムゾーンを設定しておきます。

デフォルトがグリニッジ標準時に設定されていますので、タイムゾーンの設定を追加して日本時間に合わせます。

$ heroku config:add TZ=Asia/Tokyo --app hello-world-norris
Setting TZ and restarting ⬢ music-message-board-norris... done, v3
TZ: Asia/Tokyo

下記コマンドで設定が反映されているか確認します。

$ heroku run date -a hello-world-norris
Running date on ⬢ hello-world-norris... up, run.5054 (Free)
Sat Jan 30 14:17:38 JST 2021

表示される日付時刻が現在日付時刻であることと、タイムゾーンが JST となっているのを確認できればOKです。


プロジェクトのwarファイルを作る

デプロイするWebアプリケーションのwarファイルを作成します。

Eclipseでプロジェクトを右クリック→エクスポート→WARファイルを選択すればOKです。


WARファイルをHerokuにデプロイ

作成したwarファイルをHrokuにデプロイするのですが、そのまえに自身のPCの環境を設定しておきます。

$ export PATH=$PATH:/Applications/Eclipse_2020-06.app/Contents/java/8/Home/bin
$ export JAVA_HOME=/Applications/Eclipse_2020-06.app/Contents/java/8/Home


設定ができたら、下記のコマンドでいよいよデプロイ開始です。

$ HEROKU_DEBUG=1 heroku war:deploy ~/servlet.war --app hello-world-norris --webapp-runner 8.0.50.0
Uploading servlet.war
java -Dheroku.appName=hello-world-norris -Xmx1g -Dheroku.webappRunnerVersion=8.0.50.0 -Dheroku.warFile=/Users/norris/servlet.war -jar /Users/norris/.local/share/heroku/node_modules/@heroku-cli/plugin-java/lib/heroku-deploy-complete.jar
-----> Packaging application...
       - app: hello-world-norris
       - including: webapp-runner.jar
       - including: servlet.war
Procfile:
===================
web: java $JAVA_OPTS -jar webapp-runner.jar ${WEBAPP_RUNNER_OPTS} --port $PORT ./servlet.war

===================
Heroku existing config variables: [TZ]
-----> Creating build...
       - file: slug.tgz
       - size: 8MB
Heroku Blob URL: https://s3-external-1.amazonaws.com/heroku-sources-production/f9e6a55a-5bb5-45a0-abbf-3443c0bfca36?AWSAccessKeyId=AKIAJ6LKZGKGPARPZE4A&Signature=Erdth9fr5bHosltBAENR338ESr4%3D&Expires=1611987877
-----> Uploading build...
       - success
-----> Deploying...
remote:
remote: -----> Building on the Heroku-20 stack
remote: -----> heroku-deploy app detected
remote: -----> Installing JDK 1.8... done
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 60.4M
remote: -----> Launching...
remote:        Released v4
remote:        https://hello-world-norris.herokuapp.com/ deployed to Heroku
remote:
-----> Done

これでデプロイ成功です!

最後に表示されているURLにアクセスすればページが表示されます!

今回の場合は

https://hello-world-norris.herokuapp.com/helloworld

となります。




オンラインプログラミングスクール
未来エンジニア養成所Logo