Maven で war ファイルを作成する

Maven で war ファイルを作成してみたので、メモしておきます。

war ファイルを作成するプラグインがあるので、こいつを使ってます。

Apache Maven WAR Plugin – Introduction
< http://maven.apache.org/plugins/maven-war-plugin/ >

Apache Maven WAR Plugin – Usage
< http://maven.apache.org/plugins/maven-war-plugin/usage.html >


1. プロジェクトを作成する

まずは、以下のコマンドでプロジェクトを作成する。

mvn archetype:generate -DgroupId=com.example -DartifactId=web-app -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

Web アプリケーションになるので、Archetypes には "maven-archetype-webapp" を指定します。

Maven – Introduction to Archetypes
< http://maven.apache.org/guides/introduction/introduction-to-archetypes.html >

以下のようなディレクトリが作成されるはずです。

└── web-app
    ├── pom.xml
    └── src
        └── main
            ├── resources
            └── webapp
                ├── WEB-INF
                │   └── web.xml
                └── index.jsp


2. Web アプリケーションに必要なファイル等を作成する

サーブレット ( HelloServlet ) の追加と、web.xml を編集しました。

■ HelloServlet.java ( main/java/com/example 配下に作成する )

package com.example;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {
    
  public void doGet (HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
        
    PrintWriter out = res.getWriter();
    out.println("<html><body>");
    out.println("<h1>Hello Servlet !!</h1>");
    out.println("</body></html>");
  }
}

■ web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0">

  <display-name>Archetype Created Web Application</display-name>

  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.example.HelloServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>


3. pom.xml を編集する

必要なのは「Apache Maven WAR Plugin を使う設定」と「サーブレットコンパイルするためのライブラリの追加」になります。

■ 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.example</groupId>
  <artifactId>web-app</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>web-app Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
	    <version>3.0.1</version>
    </dependency>

  <build>
    <finalName>web-app</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <packagingExcludes>WEB-INF/lib/javax.servlet-api-3.0.1.jar</packagingExcludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

アプリケーションの実行の際は、AP サーバ側のライブラリを使うことになるので、コンパイルするために追加したサーブレット API は packagingExcludes で war ファイルから除外してます ( これはなんとなく他の方法がありそうな気がする・・・ )。

※ packagingExcludes は以下のドキュメントに情報があります。

Apache Maven WAR Plugin – Including and Excluding Files From the WAR
< http://maven.apache.org/plugins/maven-war-plugin/examples/including-excluding-files-from-war.html >


4. war ファイルにパッケージングする

「mvn package」、もしくは、「mvn compile war:war」( お好きな方で ) で war ファイルにパッケージングします。
成功すると target ディレクトリ直下に web-app.war というファイルができているはずです。


あとは、適当な AP サーバにデプロイして、HelloServlet にアクセスで「Hello Servlet !!」と表示されれば、ひとまず成功です ( 一応 Tomcat 7.0.52 で動作確認済みです )。

以上になります。

[ 環境情報 ]
Ubuntu 14.04
Maven 2.2.1
OpenJDK 1.7.0_65