shiba-hiro’s 備忘録

技術ブログの皮を被ったただの備忘録

warファイルを作成してTomcatへデプロイする

前2回の記事でTomcatの使い方について理解できたので、別のデプロイ方法に移ります。
今回はJavaのウェブアプリの成果物としてwarファイルを作成し、これをTomcatへデプロイして動作させる方法をとります。
デプロイするプログラムは、とりあえず先日と同じく、GETのHTTPリクエストに対してレスポンスを返すものとします。

shiba-hiro.hatenablog.com

shiba-hiro.hatenablog.com

warファイルについて

ファイルを生成する前に、そもそもwarファイルって何なんでしょうか。
これは、Web application ARchiveの略称で、Webアプリの実行に必要な諸々がzip形式で圧縮されたものになります。
「諸々」には、webアプリで利用されるためのクラスファイルや設定系のファイル(web.xmlとか)、jsp、ライブラリなどが含まれます。
これらが、特定の階層構造に沿って配置されることが想定されています。

IBM Knowledge Center

Webアプリケーションをwarファイルでまとめる:JavaTips 〜JSP/サーブレット編 - @IT

似た名称のものとしてjarファイル(Java ARchive)があります。
こちらもやはりzip形式で圧縮されたものですが、複数のクラスファイルなどがひとつにまとめられたアーカイブになります。

JAR ファイルの概要

圧縮形式はzipなわけですが、特定の決まりや機能、構造を持たせて拡張子を統一することで、役割をわかりやすくしているわけですね。

プロジェクトの作成

Mavenを利用してプロジェクトを作成します。
Mavenの導入方法は下記の記事を参照のこと。

shiba-hiro.hatenablog.com

今回はmaven-archetype-webappというarchetypeを指定します。

$ mvn archetype:generate \
> -DgroupId=com.sample.webproject \
> -DartifactId=webproject \
> -DarchetypeArtifactId=maven-archetype-webapp

webprojectというディレクトリができるので、Javaのソースの置き場所を作成します。

$ cd webproject/
$ mkdir -p src/main/java/com/sample/webproject

作成したディレクトリへ、次のようにSampleAPIController.javaを置きます。

package com.sample.webproject;

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

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

public class SampleAPIController extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        
        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        out.println(" { \"key\" : \"value\" } ");

        return;
    }
}

サーブレットAPIを利用するために、pom.xmlへも次の依存を追記して・・・

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.4</version>
      <scope>provided</scope>
    </dependency>

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">
  <servlet>
    <servlet-name>SampleAPIControllerName</servlet-name>
    <servlet-class>com.sample.webproject.SampleAPIController</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>SampleAPIControllerName</servlet-name>
    <url-pattern>/get-api</url-pattern>
  </servlet-mapping>
</web-app>

warファイルの生成とTomcatへのデプロイ

ではwarファイルを生成してTomcatへデプロイしましょう。
warファイルは、ホストOSで作ったものを仮想環境へ共有しても、仮想環境上でmvnコマンドを使って生成してもどちらでも構いません。

コマンドを実行する前に、pom.xmlを再度確認しておきましょう。
<packaging>war</packaging>という記述があることがわかると思います。
ここで指定されているものが、このプロジェクトの成果物の形になります。

ではプロジェクト配下でmvn packageを実行します。

$ mvn package

すると、targetディレクトリ配下にwebproject.warファイルができます。
このファイルを(Tomcatをインストールした仮想マシンの)/var/lib/tomcat8/webapps/ディレクトリ以下に移してTomcatを再起動しましょう。
そして指定のURLへGETリクエストを投げると・・・

$ sudo mv YOUR_DIR/webproject.war /var/lib/tomcat8/webapps/
$ sudo service tomcat8 restart

$ curl http://localhost:8080/webproject/get-api
 { "key" : "value" } 

見事レスポンスを得られました。
ビルドツールを基軸にして、プロジェクトの作成からデプロイ対象の成果物生成までをスムーズに行えました。
また、成果物をTomcatへデプロイして動作確認することもできました。
次回はDockerを用いた形でのデプロイを行ってみます。