広告

Java : 簡易ウェブサーバ (jwebserver) の使い方

JDKツールの1つとして、JDK 18 から Java Simple Web Server (jwebserver) が追加されました。
ウェブページのちょっとした確認などに便利です。

本記事では、jwebserver の基本的な使い方をご紹介します。


概要

jwebserverツールは、プロトタイプ、テストおよびデバッグに使用される最小限のHTTPサーバーを提供します。

Java Simple Web Server (jwebserver) は、JDKツールの1つとして提供されています。
機能は必要最低限で、静的なページやファイルのみを扱えます。

jwebserver はコンソールアプリケーションです。
Windows では PowerShell、Linux では Terminal などから起動できます。

※本記事では Windows の PowerShell で実行しています。

jwebserver は、java や javac といったツールと同じ場所にあります。
具体的には JAVA_HOME の bin ディレクトリにあります。

java-home-bin

事前に Path をとおしておくと便利かもしれません。

使い方の基本

それでは、実際に jwebserver を使ってみましょう。

まず、作業ディレクトリに index.html を用意します。
内容は "Java Simple Web Server!" と表示する html です。

PS R:\java-work> cat .\index.html
<html>
<body>
    Java Simple Web Server!
</body>
</html>

次に jwebserver を起動します。
とりあえずオプションはなしです。

PS R:\java-work> jwebserver.exe
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/

デフォルトでは、

  • アドレス : 127.0.0.1
  • ポート : 8000

で待ち受けます。

次に、ウェブブラウザで http://127.0.0.1:8000/ にアクセスしてみましょう。

ブラウザ表示

無事、ウェブページを表示することができました。
jwebserver 側でも、GET 要求があり 200 OK を返したことが分かります。

PS R:\java-work> jwebserver.exe
...
127.0.0.1 - - [28/Jul/2022:15:10:13 +0900] "GET / HTTP/1.1" 200 -

最後に Ctrl + C で jwebserver を停止します。

PS R:\java-work>

jwebserver が終了して、PowerShell のコマンド受け付け状態に戻りました。


オプション

ヘルプ

日本語ドキュメントの下記ページもご参照ください。

PS R:\java-work> jwebserver.exe -h
Usage: jwebserver [-b bind address] [-p port] [-d directory]
                  [-o none|info|verbose] [-h to show options]
                  [-version to show version information]
Options:
-b, --bind-address    - Address to bind to. Default: 127.0.0.1 (loopback).
                        For all interfaces use "-b 0.0.0.0" or "-b ::".
-d, --directory       - Directory to serve. Default: current directory.
-o, --output          - Output format. none|info|verbose. Default: info.
-p, --port            - Port to listen on. Default: 8000.
-h, -?, --help        - Prints this help message and exits.
-version, --version   - Prints version information and exits.
To stop the server, press Ctrl + C.

バージョン

PS R:\java-work> jwebserver.exe -version
jwebserver 18.0.1.1

待ち受けアドレス

Options:
-b, --bind-address    - Address to bind to. Default: 127.0.0.1 (loopback).

デフォルトは 127.0.0.1 です。

待ち受けアドレスを、プライベートIPアドレス(192.168.1.100) に変更する例です。

PS R:\java-work> jwebserver.exe -b 192.168.1.100
Serving R:\java-work and subdirectories on 192.168.1.100 port 8000
URL http://192.168.1.100:8000/

Java から HTTP要求する例です。

final var uri = URI.create("http://192.168.1.100:8000/");

final var request = HttpRequest.newBuilder(uri).build();
System.out.println(request); // http://192.168.1.100:8000/ GET

final var client = HttpClient.newHttpClient();
final var response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response); // (GET http://192.168.1.100:8000/) 200

ポート

Options:
-p, --port            - Port to listen on. Default: 8000.

デフォルトは 8000 です。

待ち受けポートを 8888 に変更する例です。

PS R:\java-work> jwebserver.exe -p 8888
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8888
URL http://127.0.0.1:8888/

Java から HTTP要求する例です。

final var uri = URI.create("http://127.0.0.1:8888/");

final var request = HttpRequest.newBuilder(uri).build();
System.out.println(request); // http://127.0.0.1:8888/ GET

final var client = HttpClient.newHttpClient();
final var response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response); // (GET http://127.0.0.1:8888/) 200

出力情報

Options:
-o, --output          - Output format. none|info|verbose. Default: info.

デフォルトは info です。
verbose にすると、より詳細な情報が出力されます。

PS R:\java-work> jwebserver.exe -o verbose
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/

Java から HTTP要求する例です。

final var uri = URI.create("http://127.0.0.1:8000/");

final var request = HttpRequest.newBuilder(uri).build();
System.out.println(request); // http://127.0.0.1:8000/ GET

final var client = HttpClient.newHttpClient();
final var response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response); // (GET http://127.0.0.1:8000/) 200

結果の出力です。

PS R:\java-work> jwebserver.exe -o verbose
...
127.0.0.1 - - [28/Jul/2022:16:25:38 +0900] "GET / HTTP/1.1" 200 -
Resource requested: R:\java-work
> Connection: Upgrade, HTTP2-Settings
> Http2-settings: AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA
> Host: 127.0.0.1:8000
> Upgrade: h2c
> User-agent: Java-http-client/18.0.1.1
> Content-length: 0
>
< Date: Thu, 28 Jul 2022 07:25:38 GMT
< Last-modified: Thu, 28 Jul 2022 06:05:43 GMT
< Content-type: text/html
< Content-length: 58
<

ディレクトリ指定

Options:
-d, --directory       - Directory to serve. Default: current directory.

例として a-dirb-dir の2つのディレクトリを作成します。
それぞれのディレクトリには index.html ファイルを用意して、"AAA!" と "BBB!" という内容にします。

PS R:\java-work> cat .\a-dir\index.html
AAA!
PS R:\java-work> cat .\b-dir\index.html
BBB!

まずは a-dir をカレントディレクトリとして jwebserver を起動してみましょう。

PS R:\java-work> jwebserver.exe -d R:\java-work\a-dir
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work\a-dir and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/

ウェブブラウザから http://127.0.0.1:8000/ にアクセスします。

a-dir

次に b-dir をカレントディレクトリとして jwebserver を起動してみます。

PS R:\java-work> jwebserver.exe -d R:\java-work\b-dir
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work\b-dir and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/

b-dir

無事、カレントディレクトリを切り替えることができました。

できないこと

POST, DELETE

HTTPメソッドとしては、GET と HEAD がサポートされています。
POST や DELETE には対応していません。

POSTを要求して、405 (Not Allowed) が返ってくる例です。

PS R:\java-work> jwebserver.exe
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
127.0.0.1 - - [28/Jul/2022:17:15:42 +0900] "POST / HTTP/1.1" 405 -
final var uri = URI.create("http://127.0.0.1:8000/");

final var request = HttpRequest.newBuilder(uri)
        .POST(HttpRequest.BodyPublishers.ofString("xyz"))
        .build();
System.out.println(request); // http://127.0.0.1:8000/ POST

final var client = HttpClient.newHttpClient();
final var response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response); // (POST http://127.0.0.1:8000/) 405

HTTPS

プロトコルは HTTP のみに対応しています。
HTTPS には対応していません。

HTTPS で接続しようとしてタイムアウトする例です。

PS R:\java-work> jwebserver.exe
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
final var uri = URI.create("https://127.0.0.1:8000/");
final var request = HttpRequest.newBuilder(uri)
        .timeout(Duration.ofSeconds(5))
        .build();

try {
    final var client = HttpClient.newHttpClient();
    final var response = client.send(request, HttpResponse.BodyHandlers.ofString());
} catch (HttpTimeoutException e) {
    System.out.println("Timeout!");
}

// 結果
// ↓
//Timeout!

HTTP/2

HTTP/1.1のみがサポートされています。
HTTP/2 には対応していません。

HTTP/2 で要求しても、HTTP/1.1 で応答される例です。

PS R:\java-work> jwebserver.exe
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
127.0.0.1 - - [28/Jul/2022:17:07:10 +0900] "GET / HTTP/1.1" 200 -
final var uri = URI.create("http://127.0.0.1:8000/");
final var request = HttpRequest.newBuilder(uri).build();

final var client = HttpClient.newHttpClient();
System.out.println(client.version()); // HTTP_2

final var response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response); // (GET http://127.0.0.1:8000/) 200
System.out.println(response.version()); // HTTP_1_1

まとめ

jwebserver の基本的な使い方についてご紹介しました。
ローカルでちょっとした確認をしたいときに便利ですね。


関連記事

ページの先頭へ