Gradle による Web アプリケーションの作り方

Gradle は、主に Java や Groovy, Kotlin, Scala などの言語でよく使われるビルドツール1である。 必要なライブラリーファイル(JAR ファイル)のダウンロードや、 コンパイル、テスト、サーバーへの配置などを自動的に行ってくれる。 また、プラグインで容易に拡張することができる。 ここでは、 Gretty という Web アプリケーションを開発するためのプラグインを利用する。 Gretty を使わない方法はこちらで説明する。 一般の Java アプリケーションで Gradle を利用する場合の作り方は、 こちらのページで説明する。

1ビルドツールとは
ソースファイルなどから最終生成目的物を生成するためのツールである。 ソースの依存関係に応じて、必要なコンパイルコマンドなどを呼び出す。 有名なものに Make, Ant, Maven, Gradle などがある。

設定ファイル

Gradle のビルドの設定は Groovy もしくは Kotlin で記述する。 ここでは Kotlin 版を使用する。

いくつかの Servlet や HTML からなる単純な Web アプリケーションの場合、 以下のような 2 つの設定ファイル settings.gradle.kts と build.gradle.kts で事足りるようである。 適当なディレクトリー(以下では MyServlet という名前だとして説明する)の直下に settings.gradle.kts を、その app というサブディレクトリーの下に build.gradle.kts を置く。 なお settings.gradle.kts と build.gradle.kts を同じ階層にする配置も可能だが、 将来、複数のサブプロジェクトに分割する場合に備えて build.gradle.kts をサブディレクトリー(今の場合 app)に置くことが推奨されているようである。

ファイル settings.gradle.kts

ファイル app/build.gradle.kts

ディレクトリーの構成

Gradle では(Maven もだが)ディレクトリーの配置に独特の慣習があり、 Java のソースファイルは appsrc/main/java/ の下(のパッケージに応じたディレクトリー)に 配置する。

ファイル app/src/main/java/MyDate.java

また、appsrc/main/webapp/ というディレクトリーを(今は空でも)作っておく必要がある。 ここまでで説明した MyServlet 以下のディレクトリー構造は以下のようになる。

.
├── settings.gradle.kts
└── app
    ├── build.gradle.kts
    └── src
        └── main
            ├── java
            │   └── MyDate.java
            └── webapp 
                └── … 

面倒なときは、コマンドプロンプトを開き、次のコマンドを実行すると、 上のディレクトリー構造が作成される。 (行頭の > はプロンプト)

> git clone https://guppy.eng.kagawa-u.ac.jp/2023/OOPL/MyServlet.git
> cd MyServlet

MyServlet ディレクトリーで

> gradle appRun

というコマンドを実行すると、(最初は JAR ファイルのダウンロードなども行うのでひじょうに時間がかかるかもしれないが) Tomcat あるいは Jetty が実行されるので、“Press any key to stop the server.” とメッセージが出てから、ブラウザーに「http://localhost:8080/MyServlet/MyDate」というアドレスを入力すると、 実行結果を見ることができる。 (メッセージのとおり、何かキーを押すと実行を停止する。)

なお Windows で Gradle のエラーメッセージが文字化けする場合は、以下のコマンドを gradle コマンドを実行する前に実行しておく。

> chcp 65001

ポート 8080 は Gretty のデフォルトだが、 build.gradle.kts の中の httpPort で変更することができる。 パスの中の MyServlet は build.gradle.kts の中の contextPath で指定したパスである。

また、HTML や画像などの静的なリソースは appsrc/main/webapp/ の下に配置する。

ファイル app/src/main/webapp/Aisatsu.html

ファイル app/src/main/java/Aisatsu.java

以上のファイルを配置して、 改めて gradle appRun したうえで、 ブラウザーに「http://localhost:8080/MyServlet/Aisatsu.html」と入力すると、 以下のようなフォームが表示される。

Aisatsu.html

(参考)IDE から開く場合

以上のように作成したディレクトリーは IntelliJ IDEA や Visual Studio Code などの IDE から Gradle プロジェクトとして開くことができる。 あとは、各自でググること。

(補足)Gretty プラグインを使わず Applictaion プラグインで済ます方法

Java のバージョンが新しすぎるなど、Java や Gradle のバージョンの組み合わせによって、 Gretty プラグインがうまく動作しないときがある。 ここでは、より一般的な Application プラグインで利用できる方法を説明する。 最新版の Java を使いたい場合は、この方法をお勧めする。 このやり方では、サーバーを起動する main 関数を定義し、 URL のパスと Servlet の対応を手で追加する必要がある。 (ここで使う API は Servlet の標準仕様ではなく、Jetty の独自 API である。) ここでは、Gretty を使うときと違う箇所だけ説明していく。

設定ファイル

設定ファイル settings.gradle.kts は変わらないが、app/build.gradle.kts は以下のようになる。

ファイル app/build.gradle.kts

ディレクトリーの構成

ディレクトリーの構成は変わらないが、Servlet は以下の例のように、アノテーション関連 「import jakarta.servlet.annotation.WebServlet;」と 「@WebServlet("〜")」は必要ない。(ただし、残しておいても意味がないだけで、 害になるわけではない。)

ファイル app/src/main/java/MyDate.java

面倒なときは、コマンドプロンプトを開き、次のコマンドを実行すると、 必要なディレクトリー構造(とサンプルの Servlet)が作成される。 (行頭の > はプロンプト)

> git clone https://guppy.eng.kagawa-u.ac.jp/2023/OOPL/SimpleJettyApp.git
> cd SimpleJettyApp

SimpleJettyApp ディレクトリーで

> gradle run

というコマンドを実行すると、(最初は JAR ファイルのダウンロードなども行うのでひじょうに時間がかかるかもしれないが) Jetty が実行され、“Hit enter to stop the server.” とメッセージが出てから、ブラウザーに「http://localhost:8080/MyServlet/MyDate」というアドレスを入力すると、 実行結果を見ることができる。 (メッセージのとおり、エンターキーを押すと実行を停止する。)

Servlet の追加

新しく Servlet のクラスを作成したときには、main メソッドに、URL のパスと Servlet の対応を追加する必要がある。

ファイル app/src/main/java/Main.java

この例では MyDateAisatsu の 2 つの Servlet の対応が登録されている。

        context.addServlet(MyDate.class, "/MyDate");
        context.addServlet(Aisatsu.class, "/Aisatsu");
        // ...

この 2 行に倣って、この辺りで Servlet を追加する。


Koji Kagawa (kagawa.koji@〜)
(〜の部分はSPAM mail予防のため省略します。)