Webapp Runner を使用した Tomcat ベースの Java Web アプリケーションのデプロイ
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2024年06月04日(火)
Table of Contents
Webapp Runner を使用すると、JRE がインストールされている任意のコンピュータ上で Tomcat コンテナ内のアプリケーションを起動できます。Webapp Runner を使用している場合は、Tomcat をインストールするための以前の手順は必要ありません。これは、java
コマンドを使用して実行および設定できる通常の JAR ファイルです。
この記事では、Webapp Runner で起動するアプリケーションのビルドと、そのアプリケーションの Heroku へのデプロイについて説明します。
各手順を実行してアプリをゼロから構築するか、最後までスキップしてこの記事用のソースを入手してください。また、ほぼすべての既存の Maven Webapp プロジェクトを使用することもできます。
前提条件
- Java の基本的な知識 (インストールされている JVM および Maven のバージョンなど)
- Git の基本的な知識 (インストールされている Git のバージョンなど)
Webapp Runner の動作
Webapp Runner を使用している場合は、次のようなコマンドを使用してローカルおよび Heroku 上でアプリケーションを起動します。
$ java -jar webapp-runner.jar application.war
deploying app from: /Users/johnsimone/dev/gitrepos/devcenter-webapp-runner/target/webappRunnerSample.war
Feb 14, 2012 5:21:44 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Feb 14, 2012 5:21:44 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Tomcat
Feb 14, 2012 5:21:44 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.0.30
Feb 14, 2012 5:21:44 PM org.apache.catalina.startup.ContextConfig webConfig
INFO: No global web.xml found
Feb 14, 2012 5:21:44 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Webapp Runner は次に、そこにデプロイされている特定の war を使用して Tomcat インスタンスを起動します。これは Tomcat の組み込みの API を利用しています。Webapp Runner はオープンソースであるため、ソースコードを表示したり、それに貢献したりすることができます。
アプリケーションの作成 (まだ作成してない場合)
$ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp
...
[INFO] Generating project in Interactive mode
Define value for property 'groupId': : com.example
Define value for property 'artifactId': : helloworld
任意の groupId または artifactId を選択できます。これで、helloworld
ディレクトリ内に完全な Java Web アプリが用意されました。
Webapp Runner をダウンロードするための Maven の設定
Webapp Runner を使用するために必須ではありませんが、アプリケーションでの実行が必要になるため、ビルドツールに自動的に Webapp Runner をダウンロードさせることをお勧めします。当然ながら、これを行わなくても、単に Webapp Runner をダウンロードし、それを使用してアプリケーションを起動することもできます。ただし、アプリケーションの移植性とデプロイの再現性のために、ビルド記述子ですべての依存関係が定義されるようにすることが重要です。この場合は Maven を使用しているため、依存関係プラグインを使用して jar をダウンロードします。pom.xml に次のプラグイン設定を追加します。
<build>
...
<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.heroku</groupId>
<artifactId>webapp-runner</artifactId>
<version>9.0.89.0</version>
<destFileName>webapp-runner.jar</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Webapp Runner のバージョンは、基礎となる Tomcat サーバーのバージョンに固定されます。したがって、バージョン 9.0.89.0 の Webapp Runner はバージョン 9.0.89 の Tomcat を使用します。
アプリケーションを実行する
アプリケーションをビルドするには、次を実行します。
$ mvn package
その後、次の java コマンドを使用してアプリを実行します。
$ java -jar target/dependency/webapp-runner.jar target/*.war
これで、アプリケーションがポート 8080 で起動するようになります。
注意: 起動前に WAR ファイルを展開する必要がある場合は、target/*.war
の前に --expand-war
オプションを追加できます。
Heroku へのアプリケーションのデプロイ
Procfile の作成
プロジェクトルートの Procfile
で、アプリケーションを実行する方法を宣言します。次の 1 行の内容で、このファイルを作成します。
web: java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --port $PORT target/*.war
Webapp Runner は、ルートパスにある WAR ファイルを処理します (つまり、URL のパスに WAR ファイル名は含まれない)。これを変更する必要がある場合は、--path
オプションを使用します。Webapp Runner オプションの詳細を表示するには、--help
オプションを使用して JAR ファイルを実行してください。
Heroku にデプロイする
変更を Git にコミットします。
$ git init
$ git add .
$ git commit -m "Ready to deploy"
アプリを作成します。
$ heroku create
Creating high-lightning-129... done, stack is heroku-18
http://high-lightning-129.herokuapp.com/ | git@heroku.com:high-lightning-129.git
Git remote heroku added
コードをデプロイします。
$ git push heroku main
Counting objects: 227, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (117/117), done.
Writing objects: 100% (227/227), 101.06 KiB, done.
Total 227 (delta 99), reused 220 (delta 98)
-----> Heroku receiving push
-----> Java app detected
-----> Installing Maven 3.0.3..... done
-----> executing .maven/bin/mvn -B -Duser.home=/tmp/build_1jems2so86ck4 -DskipTests=true clean install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building webappRunnerSample Maven Webapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 36.612s
[INFO] Finished at: Tue Aug 30 04:03:02 UTC 2011
[INFO] Final Memory: 19M/287M
[INFO] ------------------------------------------------------------------------
-----> Discovering process types
Procfile declares types -> web
-----> Compiled slug size is 4.5MB
-----> Launching... done, v5
http://pure-window-800.herokuapp.com deployed to Heroku
これで完了です。Web アプリが Heroku で稼働するようになりました。次のようにしてブラウザで開きます。
$ heroku open
memcache での分散 HTTP セッションの使用
セッション状態をデータベースまたはその他のバックエンドデータストアに明示的に保存することは、分散 HTTP セッションの使用に代わるよりスケーラブルな方法です。
Webapp Runner は、Tomcat 用の memcached-session-manager をサポートしています。memcache でバックアップされたセッションを有効にするには、環境変数によって memcache インスタンスの設定を使用可能にした後、セッションマネージャーを有効にする必要があります。
memcache の設定情報を使用可能にする
Heroku Memcachier アドオンでは、必要な環境変数が自動的に設定されます。既存のアプリが用意されたら、次を実行してこのアドオンを取得します。
$ heroku addons:create memcachier:dev
注意: このアドオンを追加するには、アカウントの確認が必要になることがあります。
ローカルで実行している場合は、memcache のローカルインストールを設定するか、または Heroku アドオンによって自動的にプロビジョニングされたリモート memcache サービスに接続できます。
Webapp Runner で使用される場合、memcache でバックアップされたセッションマネージャーは MEMCACHIER_SERVERS、MEMCACHIER_USERNAME、MEMCACHIER_PASSWORD の 3 つの環境変数を探します。これらを memcache のローカルインストールを指すように設定するか、または heroku config
を実行し、これらの値をローカル環境変数にコピーすることにより Heroku アドオンによって自動的にプロビジョニングされたリモート memcache サービスに接続できます。
memcached-session-manager の有効化
memcache でバックアップされたセッションを Webapp Runner で有効にするには、フラグ --session-store memcache
を含めます。
そのため、このコマンドをローカルで起動する場合は、次のようになります。
$ java -jar target/dependency/webapp-runner.jar --session-store memcache target/*.war
Procfile の場合は、次のようになります。
web: java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --port $PORT --session-store memcache target/*.war
ソースを複製する
作成手順をスキップする場合は、次のようにして、完成したサンプル (memcache でバックアップされたセッションはなし) を複製できます。
$ git clone https://github.com/heroku/devcenter-webapp-runner