Gradle Web アプリケーション開発

Gradle は Web アプリケーション開発にも使用できる。このページではプロジェクト作成と Web 開発用プラグインの使い方を説明する。

Web アプリケーションプロジェクト

一般的な Java アプリケーションは gradle init で作成できる。 ここでは Web アプリケーションをどのように作成し、どのように構成するかを説明する。

Web アプリケーションの作成

Web アプリケーションは通常の Java アプリケーションと構成も実行方法も異なる。 Java クラスだけでなく HTML や JSP も使用するため、それらのファイルをまとめて WAR ファイルを作成する必要がある。 また、実行にはサーブレットコンテナ、つまり Java サーバーも必要になる。

そのため、通常の Java アプリケーションの作成方法だけでは不十分である。 実際にプロジェクトを作りながら Web アプリケーション開発の手順を確認する。

まずプロジェクトディレクトリを作成する。

$ mkdir GradleWebApp
$ cd GradleWebApp

次に Gradle を初期化する。

$ gradle init --type java-application

これは一般的な Java アプリケーションと同じ方法である。

$ mkdir GradleWebApp
$ cd GradleWebApp
$ gradle init --type java-application
Starting a Gradle Daemon (subsequent builds will be faster)

BUILD SUCCESSFUL in 16s
2 actionable tasks: 2 executed
$ ls
build.gradle    gradle          gradlew         gradlew.bat     settings.gradle src

2017 年 12 月時点では、Gradle に Web アプリケーション専用のプロジェクトタイプは用意されていなかった。 そのため java-application タイプで初期化し、残りの Web プロジェクト構成は手動で作成する。

Web アプリケーションのディレクトリ構成

Web アプリケーション用のフォルダ構成を用意する。 構成は次のようになる。

.
├── build.gradle, others omitted
└── src
    └── main
    │   ├── java
    │   ├── resources
    │   └── webapp
    │       └── WEB-INF
    └── test
        └── java
            └── AppTest.java

Web アプリケーションと通常の Java アプリケーションの大きな違いは、main ディレクトリ配下の構成である。 ここには次の 3 つのディレクトリがある。

  • java: Java ソースコードを配置するディレクトリ。サーブレットなどのソースコードをここに配置する。
  • webapp: Web アプリケーションとして公開されるディレクトリ。JSP や HTML などをここに配置する。また WEB-INF を作成し、その中に web.xml を配置する。
  • resources: アプリケーションに必要なリソースを配置するディレクトリ。Web ページに表示する画像などではなく、JPA で使用する persistence.xml のようなプログラム用リソースを配置する。

src/main の下に webappresources を作成し、さらに webapp の下に WEB-INF を作成する。

web.xml

Web アプリケーションの各種情報を記述する web.xml を用意する。 この例では Servlet 3.1 を使用する。

<?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_3_1.xsd"
       version="3.1">

</web-app>

サーブレットの準備

Web アプリケーションで表示する簡単なサーブレットを作成する。 src/main/java の下に com/devkuma/web を作成し、SampleServlet.java を作成する。

package com.devkuma.web;
 
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/hello")
public class SampleServlet extends HttpServlet {
 
    private static final long serialVersionUID = 1L;
 
    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<html><head><title>Servlet</title></head>");
        out.println("<body><h1>Sample Servlet</h1>");
        out.println("<p>Welcome to Sample Servlet page!</p>");
        out.println("</body></html>");
    }
}

ここでは @WebServlet アノテーションを使って /hello にサーブレットを割り当てている。 この設定には Servlet API 3.0 以上が必要である。 サーブレットコンテナのバージョンによって動作しない場合があるため、実行環境を確認する。 JSP や HTML ファイルは webapp 配下に配置すればよい。

最終的なディレクトリとファイル構成

すべてのファイルを作成すると、構成は次のようになる。

.
├── build.gradle, others omitted
└── src
    ├── main
    │   ├── java
    │   │   ├── App.java
    │   │   └── com
    │   │       └── devkuma
    │   │           └── web
    │   │               └── SampleServlet.java
    │   ├── resources
    │   └── webapp
    │       └── WEB-INF
    │           └── web.xml
    └── test
        └── java
            └── AppTest.java

build.gradle ビルドファイルの作成

Web アプリケーション用の build.gradle を作成する。 通常の Java アプリケーションとはいくつか異なる点がある。

build.gradle

全体のソースコードは次のとおりである。

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'gretty'
 
buildscript {
    repositories {
        jcenter()
    }
 
    dependencies {
        classpath group:'org.akhikhl.gretty', name:'gretty-plugin', version:'+'
    }
}
 
repositories {
    jcenter()
}
 
dependencies {
    testCompile group:'junit', name:'junit', version:'4.12'
}

ファイルを書いたら、WAR ファイルを作成する。

$ gradle war

これは Web アプリケーションを WAR ファイルとして生成するためのコマンドである。 実行すると、build ディレクトリ配下の libsGradleWebApp.war が作成される。

続いてアプリケーションの動作を確認する。

$ gradle run

実行すると Jetty がダウンロードされ、起動する。 次の URL にアクセスするとサーブレットが表示される。

http://localhost:8080/GradleWebApp/hello

使用するプラグイン

build.gradle では 3 つのプラグインを適用している。

apply plugin : 'java'
apply plugin : 'war'
apply plugin : 'gretty'

java は Java プログラム向けに compileJava などのタスクを提供するプラグインである。

war は WAR ファイルとしてパッケージ化するためのプラグインである。 Web アプリケーションでは必須といえる。 先ほどの gradle war はこのプラグインが提供する。

gretty は Jetty サーブレットコンテナを利用するためのプラグインである。 Gretty は Jetty を Gradle から利用するための外部プラグインであり、gradle run によって Jetty を起動して Web アプリケーションを実行する。

buildscriptdependencies

build.gradle には buildscript というブロックが追加されている。

buildscript {
    repositories {
        // repositories
    }

    dependencies {
        // package settings
    }
}

buildscript はビルドそのものを実行するスクリプトのための設定である。 Gradle に標準で備わっている機能だけでビルドする場合は、このブロックは不要である。 外部ライブラリや外部プラグインをビルド時に使用する場合に必要になる。

今回使用している Gretty プラグインは Gradle 標準ではなく外部ライブラリである。 そのため、ビルド時にどのリポジトリからどのライブラリを使用するかを指定する必要がある。 その設定が buildscript 内の repositoriesdependencies である。

buildscript の後にある repositoriesdependencies は、ビルド処理以外のプロジェクト側で使用される。 ここでは JUnit が dependencies に設定されている。

これで Gradle による Web アプリケーションのビルドと実行の基本を確認できた。