My開発メモ

herokuにTomcat-Webアプリをデプロイする

数年ぶりに Heroku に Webアプリをデプロイしたので、メモしておく。

デプロイしたのは、Tomcat9 で動作するWebアプリである。

  1. ターゲット: Tomcat9、Java11
  2. 動的Webモジュールバージョン: 4.0

手順として参考にしたのは、以下。

Webapp Runner を使用した Tomcat ベースの Java Web アプリケーションのデプロイ

ていうか、この手順通りにおこなった。

この手順は、Eclipseではなさそうなので、ターミナルで作業した。

maven プロジェクトを作成

適当なディレクトリにて、アプリのディレクトリを作成し、その中で、 mavenプロジェクトを作成した。

$ mkdir heroku-app
$ cd heroku-app
$ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp

いろいろ問われるので、以下のように答えた。

groupIdcom.billies_works
artifactIdindean-poker
version<Enter>
package<Enter>
Y: :<Enter>

すると、ビルドが始まり、indean-poker というディレクトリができる。

$ tree -F ./
./
└── indean-poker/
    ├── pom.xml
    └── src/
        └── main/
            ├── resources/
            └── webapp/
                ├── WEB-INF/
                │   └── web.xml
                └── index.jsp

pom.xml の修正

pom.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>com.billies_works</groupId>
  <artifactId>indean-poker</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>indean-poker Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <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>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
      <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2.1-b03</version>
      <scope>provided</scope>
    </dependency>    
    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
	<dependency>
	  <groupId>javax.servlet.jsp.jstl</groupId>
	  <artifactId>jstl-api</artifactId>
	  <version>1.2</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.glassfish.web/jstl-impl -->
	<dependency>
	  <groupId>org.glassfish.web</groupId>
	  <artifactId>jstl-impl</artifactId>
	  <version>1.2</version>
	  <scope>runtime</scope>
	</dependency>
  </dependencies>
  
  <build>
    <finalName>indean-poker</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-clean-plugin</artifactId>
        <version>3.1.0</version>
      </plugin>
      <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.0.2</version>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.1</version>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.2</version>
      </plugin>
      <plugin>
        <artifactId>maven-install-plugin</artifactId>
        <version>2.5.2</version>
      </plugin>
      <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.8.2</version>
      </plugin>
      <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.52.1</version>
                  <destFileName>webapp-runner.jar</destFileName>
                </artifactItem>
              </artifactItems>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

上記中、<maven.compiler.source> と <maven.compiler.target> は 最初 11 を指定したのだけれど、Heroku でのビルドでエラーが出たので 1.8 にした。

また、javax.servlet.api を 3.0.1 にしているが、これは、以前使っていた pom.xmlからコピペしただけなので、このままになっている。4.0.1 も使える のかもしれない。後日確かめたい。

web.xml

web.xml は、オリジナルのもののままだと EL式が使えないので、以下にした。

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

上記の pom.xml だと servlet.api を 3.0.1 にしているので、3.0 に するべきだったかも。

このへん、Maven についてあまり知らないので、ちぐはぐなところがあるかも しれない。

できあがりファイル構成

できあがりは、以下である。

$ tree -F ./ | c2a0space
./
└── indean-poker/
    ├── pom.xml
    └── src/
        └── main/
            ├── java/
            │   └── com/
            │       └── billies_works/
            │           ├── filter/
            │           │   └── EncFilter.java
            │           ├── listener/
            │           │   ├── CardSetListener.java
            │           │   ├── PlayerInit.java
            │           │   └── SetContextPathListener.java
            │           ├── model/
            │           │   ├── Card.java
            │           │   ├── CardComparator.java
            │           │   ├── Player.java
            │           │   └── Poker.java
            │           ├── servlet/
            │           │   ├── Bet.java
            │           │   ├── Bout.java
            │           │   ├── Giveup.java
            │           │   ├── GoodBy.java
            │           │   ├── Play.java
            │           │   └── Remake.java
            │           └── util/
            │               ├── Const.java
            │               └── Game.java
            ├── resources/
            └── webapp/
                ├── WEB-INF/
                │   ├── jsp/
                │   │   ├── aside.jsp
                │   │   ├── empty.jsp
                │   │   ├── footer.jsp
                │   │   ├── goodby.jsp
                │   │   ├── header.jsp
                │   │   ├── play.jsp
                │   │   └── result.jsp
                │   ├── lib/
                │   └── web.xml
                ├── css/
                │   └── style.css
                ├── favicon.ico
                ├── img/
                │   ├── cardBack.png
                │   ├── club1.png
                │   ├── club10.png
                │   ├── club11.png
                │   ├── club12.png
                │   ├── club13.png
                │   ├── club2.png
                │   ├── club3.png
                │   ├── club4.png
                │   ├── club5.png
                │   ├── club6.png
                │   ├── club7.png
                │   ├── club8.png
                │   ├── club9.png
                │   ├── diamond1.png
                │   ├── diamond10.png
                │   ├── diamond11.png
                │   ├── diamond12.png
                │   ├── diamond13.png
                │   ├── diamond2.png
                │   ├── diamond3.png
                │   ├── diamond4.png
                │   ├── diamond5.png
                │   ├── diamond6.png
                │   ├── diamond7.png
                │   ├── diamond8.png
                │   ├── diamond9.png
                │   ├── face_boy1.png
                │   ├── face_boy2.png
                │   ├── face_boy3.png
                │   ├── face_boy4.png
                │   ├── face_boy5.png
                │   ├── furikaeru_boy.png
                │   ├── heart1.png
                │   ├── heart10.png
                │   ├── heart11.png
                │   ├── heart12.png
                │   ├── heart13.png
                │   ├── heart2.png
                │   ├── heart3.png
                │   ├── heart4.png
                │   ├── heart5.png
                │   ├── heart6.png
                │   ├── heart7.png
                │   ├── heart8.png
                │   ├── heart9.png
                │   ├── joker.png
                │   ├── lose_boy.png
                │   ├── spade1.png
                │   ├── spade10.png
                │   ├── spade11.png
                │   ├── spade12.png
                │   ├── spade13.png
                │   ├── spade2.png
                │   ├── spade3.png
                │   ├── spade4.png
                │   ├── spade5.png
                │   ├── spade6.png
                │   ├── spade7.png
                │   ├── spade8.png
                │   ├── spade9.png
                │   ├── tobokeru_boy.png
                │   └── win_boy.png
                ├── index.jsp
                └── js/
                    └── poker.js

mvn package を実行

ここで、ビルドを実行する。

$ mvn package

すると、無事 BUILD SUCCESS と出る。

アプリケーションの実行

以下のコマンドでアプリケーションを実行する。

$ java -jar target/dependency/webapp-runner.jar target/*.war

これで http://localhost:8080/ でアプリにアクセスできる。

Heroku へのデプロイ

プロジェクトのトップディレクトリに、以下のファイルを作成する。

Procfile

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

Git にコミットして、アプリを作成し、デプロイする。

$ git init
$ git add .
$ git commit -m "Ready to deploy"
$ heroku create
$ git push heroku master

これで、動作している。

以下のコマンドで、ブラウザで表示できる。

$ heroku open

今回のアプリの URL は以下である。

https://blooming-waters-78333.herokuapp.com/

Herokuアプリの更新手順

herokuアプリのソースの修正のあと、以下の手順で更新できる。

$ git add .
$ git commit -m "code is modified."
$ git push heroku master

参考

カテゴリー: Java, memo

タグ: heroku, java, jsp, servlet, tomcat

カウント: 225