【Java】「Jetty」で「Servlet」を実行するときの注意事項

今回は、「Jetty」で「Servlet(Java Servlet)」を実行するときの注意事項を紹介していきます。

「Jetty」の実行は、「Gradle」プラグインの「Gretty」を使用しています。「Gretty」は、「Jetty」などのWebアプリを実行するためのプラグインになります。

スポンサーリンク

検証環境

検証に使用した環境/ライブラリを次に記載します。

  • Java
    • バージョン:11
  • Gretty
    • バージョン:4.0.1
  • Jetty
    • バージョン:11.0.8
  • Gradle
    • バージョン:7.3

注意事項

「Jetty」では、対応している「Servlet」のバージョンに違いがあります。使用する場合は、対応している「Servlet」のバージョンを使用する必要があります。

特に「Servlet」のバージョン「5.0」からは、名前空間が「javax.servlet」から「jakarta.servlet」に変更となりました。公式サイトの情報をまとめると、次のような対応表になります。

Jetty VersionServlet VersionNamespaceJava Version
Jetty 9.4.x3.1JavaEE 8/javax.servlet.*Java 8
Jetty 10.0.x4.0JakartaEE 8/javax.servlet.*Java 11+
Jetty 11.0.x5.0JakartaEE 9/jakarta.servlet.*   Java 11+
「Jetty」と「Servlet」バージョンなどの対応表

検証環境に記載した「Gretty」を使用する場合は、「Jetty」のバージョンは「11.0.x」になります。この場合は、「javax.servlet」ではなく「jakarta.servlet」を使用する必要があります。

プログラム例(jakarta.servlet)

名前空間に「jakarta.servlet」を使用したプログラム例になります。

ビルドスクリプト

プログラム例で使用するビルドスクリプトは、次のようになります。

plugins {
  id 'war'
  id 'org.gretty' version '4.0.1'
}

sourceCompatibility = 11
tasks.withType(JavaCompile) {options.encoding = 'UTF-8'}
repositories.mavenCentral()

dependencies {
  compileOnly 'jakarta.servlet:jakarta.servlet-api:5.0.0'
}

gretty {
  contextPath = "/"
}

Servletクラス

Servletクラスのプログラム例は、次のようになります。

package com.fumidzuki;

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

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


@WebServlet("/")
public class ExampleServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse res)
      throws ServletException, IOException {
    PrintWriter out = res.getWriter();
    out.println("Hello World!");
  }

}

実行方法

コンソール画面などから「Gradle」の「Gratty」のタスクを実行して「Jetty」を起動します。実行方法例は、次のようになります。

$ gradlew appRun
...
DEBUG o.akhikhl.gretty.JettyServerManager - Jetty 11.0.8 started.

「Jetty 11.0.8 started」が出力されていれば、起動に成功しています。

実行例

Servletクラスにアクセスできることを確認します。実行例は、次のようになります。

$ curl http://localhost:8080
Hello World!

Servletクラスで指定した出力情報が取得できることを確認できます。

プログラム例(javax.servlet)

名前空間に「javax.servlet」を使用したプログラム例になります。

ビルドスクリプト

プログラム例で使用するビルドスクリプトは、次のようになります。

plugins {
  id 'war'
  id 'org.gretty' version '4.0.1'
}

sourceCompatibility = 11
tasks.withType(JavaCompile) {options.encoding = 'UTF-8'}
repositories.mavenCentral()

dependencies {
  compileOnly 'javax.servlet:javax.servlet-api:4.0.1'
}

gretty {
  contextPath = "/"
}

Servletクラス

Servletクラスのプログラム例は、次のようになります。

package com.fumidzuki;

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("/")
public class ExampleV4Servlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    PrintWriter out = resp.getWriter();
    out.println("Hello World!");
  }

}

実行方法

コンソール画面などから「Gradle」の「Gratty」のタスクを実行して「Jetty」を起動します。実行方法例は、次のようになります。

$ gradlew appRun
...
DEBUG o.akhikhl.gretty.JettyServerManager - Jetty 11.0.8 started.

「Jetty 11.0.8 started」が出力されていれば、起動に成功しています。

実行例

Servletクラスにアクセスできることを確認します。実行例は、次のようになります。

$ curl http://localhost:8080
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link href="jetty-dir.css" rel="stylesheet" />
<title>Directory: /</title>
</head>
<body>
<h1 class="title">Directory: /</h1>
<table class="listing">
<thead>
<tr><th class="name"><a href="?C=N&O=D">Name&nbsp; &#8679;</a></th><th class="lastmodified"><a href="?C=M&O=A">Last Modified</a></th><th class="size"><a href="?C=S&O=A">Size</a></th></tr>
</thead>
<tbody>
</tbody>
</table>
</body></html>

Servletクラスで指定した出力情報とは違う情報となることを確認できます。

まとめ

「Jetty」で「Servlet」を使用するときの注意事項を紹介しました。使用する場合は、「Jetty」と「Servlet」のバージョンの関連に注意してください。