warファイルを作成してTomcatへデプロイする
前2回の記事でTomcatの使い方について理解できたので、別のデプロイ方法に移ります。
今回はJavaのウェブアプリの成果物としてwarファイルを作成し、これをTomcatへデプロイして動作させる方法をとります。
デプロイするプログラムは、とりあえず先日と同じく、GETのHTTPリクエストに対してレスポンスを返すものとします。
warファイルについて
ファイルを生成する前に、そもそもwarファイルって何なんでしょうか。
これは、Web application ARchiveの略称で、Webアプリの実行に必要な諸々がzip形式で圧縮されたものになります。
「諸々」には、webアプリで利用されるためのクラスファイルや設定系のファイル(web.xmlとか)、jsp、ライブラリなどが含まれます。
これらが、特定の階層構造に沿って配置されることが想定されています。
Webアプリケーションをwarファイルでまとめる:JavaTips 〜JSP/サーブレット編 - @IT
似た名称のものとしてjarファイル(Java ARchive)があります。
こちらもやはりzip形式で圧縮されたものですが、複数のクラスファイルなどがひとつにまとめられたアーカイブになります。
圧縮形式はzipなわけですが、特定の決まりや機能、構造を持たせて拡張子を統一することで、役割をわかりやすくしているわけですね。
プロジェクトの作成
Mavenを利用してプロジェクトを作成します。
Mavenの導入方法は下記の記事を参照のこと。
今回は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を用いた形でのデプロイを行ってみます。