$ java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)
$ java -jar $JETTY_HOME/start.jar --version
Jetty Server Classpath:
-----------------------
Version Information on 22 entries in the classpath.
Note: order presented here is how they would appear on the classpath.
changes to the --module=name command line options will be reflected here.
0: (dir) | ${jetty.base}/resources
1: 2.0.0-alpha1 | ${jetty.home}/lib/logging/slf4j-api-2.0.0-alpha1.jar
2: 11.0.6 | ${jetty.home}/lib/logging/jetty-slf4j-impl-11.0.6.jar
3: 5.0.2 | ${jetty.home}/lib/jetty-jakarta-servlet-api-5.0.2.jar
4: 11.0.6 | ${jetty.home}/lib/jetty-http-11.0.6.jar
5: 11.0.6 | ${jetty.home}/lib/jetty-server-11.0.6.jar
6: 11.0.6 | ${jetty.home}/lib/jetty-xml-11.0.6.jar
7: 11.0.6 | ${jetty.home}/lib/jetty-util-11.0.6.jar
8: 11.0.6 | ${jetty.home}/lib/jetty-io-11.0.6.jar
9: 11.0.6 | ${jetty.home}/lib/jetty-jndi-11.0.6.jar
10: 11.0.6 | ${jetty.home}/lib/jetty-security-11.0.6.jar
11: 11.0.6 | ${jetty.home}/lib/jetty-servlet-11.0.6.jar
12: 11.0.6 | ${jetty.home}/lib/jetty-webapp-11.0.6.jar
13: 11.0.6 | ${jetty.home}/lib/jetty-plus-11.0.6.jar
14: 2.0.0 | ${jetty.home}/lib/jakarta.transaction-api-2.0.0.jar
15: 11.0.6 | ${jetty.home}/lib/jetty-annotations-11.0.6.jar
16: 9.1 | ${jetty.home}/lib/annotations/asm-9.1.jar
17: 9.1 | ${jetty.home}/lib/annotations/asm-analysis-9.1.jar
18: 9.1 | ${jetty.home}/lib/annotations/asm-commons-9.1.jar
19: 9.1 | ${jetty.home}/lib/annotations/asm-tree-9.1.jar
20: 2.0.0 | ${jetty.home}/lib/annotations/jakarta.annotation-api-2.0.0.jar
21: 11.0.6 | ${jetty.home}/lib/jetty-deploy-11.0.6.jar
- とりあえずプロジェクトを作る
- ディレクトリはこんな感じ
$ tree .
.
├── pom.xml
└── src
└── main
└── java
└── org
└── example
└── servlet
└── DemoServlet.java
6 directories, 2 files
xml version="1.0" encoding="UTF-8"
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance"
xsischemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>servlet</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>Servlet Maven Webapp</name>
<properties>
<projectbuildsourceEncoding>UTF-8</projectbuildsourceEncoding>
<mavencompilersource>11</mavencompilersource>
<mavencompilertarget>11</mavencompilertarget>
</properties>
<dependencies>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
maven-war-plugin
は failOnMissingWebXml
を false
にする
- こうしておかないと web.xml がないぞ、と怒られ war ができない
- ドキュメントでもそう書いてある
- ただ、 Servlet 3.0 以上かつプラグインが 3.1.0 以上の場合はデフォルト値が false と書いてあるのだが、明示的に指定しないとうまく war が作れなかった
- もしかして javax パッケージを前提としているのかも?
- DemoServlet.javaはこんなかんじ
package org.example.servlet;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/")
public class DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
var writer = resp.getWriter();
writer.write("Hello, from Jakarta Servlet 5");
}
}
@WebServlet
を使えばとりあえず web.xml なしでHTTPRequestを受け取れる
urlPatterns
にはパスを書く
- 今回はルートにした
- Jettyの設定を行う
- Jettyはannotationsプラグインが有効になっていないとこれらのアノテーションがスキャンされないらしい
- ここにそうかいてある
- これに気が付かずすごい苦戦した
- annotationsプラグインを有効にする
$ java -jar $JETTY_HOME/start.jar --add-module=annotations
INFO : jndi transitively enabled
INFO : annotations initialized in ${jetty.base}/start.d/annotations.ini
INFO : plus transitively enabled
INFO : Base directory was modified
$ java -jar $JETTY_HOME/start.jar --list-modules
〜略〜
Enabled Modules:
----------------
0) resources transitive provider of resources for logging-jetty
1) logging/slf4j transitive provider of logging/slf4j for logging-jetty
dynamic dependency of logging-jetty
2) logging-jetty transitive provider of logging for threadpool
transitive provider of logging for bytebufferpool
transitive provider of logging for server
3) bytebufferpool transitive provider of bytebufferpool for server
init template available with --add-module=bytebufferpool
4) threadpool transitive provider of threadpool for server
init template available with --add-module=threadpool
5) server transitive provider of server for http
transitive provider of server for plus
transitive provider of server for security
transitive provider of server for servlet
transitive provider of server for jndi
init template available with --add-module=server
6) jndi transitive provider of jndi for plus
7) security transitive provider of security for webapp
transitive provider of security for plus
8) servlet ${jetty.base}/start.d/servlet.ini
9) webapp ${jetty.base}/start.d/webapp.ini
10) plus transitive provider of plus for annotations
11) annotations ${jetty.base}/start.d/annotations.ini
12) deploy ${jetty.base}/start.d/deploy.ini
13) http ${jetty.base}/start.d/http.ini
$ curl http://localhost:8080/servlet-1.0-SNAPSHOT/
Hello, from Jakarta Servlet 5