本ブログは、Java Advent Calendar 2025の7日目のエントリーです。
事象
突然ですが、jwebserverをご存じでしょうか。
簡単に使い方を知るためにヘルプを見てみましょう。
日本語のWindows 11でJDK 24を使って見てみます。
>%JDK24%\bin\jwebserver.exe -h
菴ソ逕ィ譁ケ豕・ jwebserver [-b bind address] [-p port] [-d directory]
[-o none|info|verbose] [-h to show options]
[-version to show version information]
繧ェ繝励す繝ァ繝ウ:
-b, --bind-address - 繝舌う繝ウ繝牙・繧「繝峨Ξ繧ケ縲ゅョ繝輔か繝ォ繝・ 127.0.0.1 (繝ォ繝シ繝励ヰ繝・け)縲・ 縺吶∋縺ヲ縺ョ繧、繝ウ繧ソ繝輔ぉ繝シ繧ケ縺ァ"-b 0.0.0.0"縺セ縺溘・"-b ::"繧剃スソ逕ィ縺励∪縺吶・-d, --directory - 菴ソ逕ィ縺吶k繝・ぅ繝ャ繧ッ繝医Μ縲ゅョ繝輔か繝ォ繝・ 迴セ蝨ィ縺ョ繝・ぅ繝ャ繧ッ繝医Μ縲・-o, --output - 蜃コ蜉帛ス「蠑上Oone|info|verbose縲ゅョ繝輔か繝ォ繝・ info縲・-p, --port - 繝ェ繧ケ繝九Φ繧ー縺吶k繝昴・繝医ゅョ繝輔か繝ォ繝・ 8000縲・-h, -?, --help - 繝倥Ν繝励・繝。繝・そ繝シ繧ク繧貞・蜉帙@縺ヲ邨ゆコ・@縺セ縺吶・-version, --version - 繝舌・繧ク繝ァ繝ウ諠・ア繧貞・蜉帙@縺ヲ邨ゆコ・@縺セ縺吶・繧オ繝シ繝舌・繧貞●豁「縺吶k縺ォ縺ッ縲ーCtrl]+[C]繧呈款縺励∪縺吶・
実行してみましたが、文字化けしてしまいました。
原因
原因は、日本語のWindows 11のコマンドプロンプトで使用される文字コードと、jwebserverの出力の文字コードが異なることにあります。
日本語のWindows 11のコマンドプロンプトで使用される文字コードはMS932です。
>chcp
現在のコード ページ: 932
jwebserverの出力の文字コードはUTF-8です。
これはOpenJDKのソースコードを見るとわかります。
PrintWriterのコンストラクタの第三引数にUTF-8が指定されています。
バグ修正
ヘルプメッセージが文字化けすることは明らかなOpenJDKのバグです。
なので、私はOpenJDKにバグ報告をし、プルリクエストを発行し、文字化けが発生しないように修正しました。
イシュー:https://bugs.openjdk.org/browse/JDK-8353698
プルリクエスト:https://github.com/openjdk/jdk/pull/24437
JDK 25では修正済みなので、文字化けが発生することなく使うことができます。
ちなみに、JDK 21は、2025年10月版(21.0.9)以降では文字化けしません。
>%JDK25%\bin\jwebserver.exe -h
使用方法: jwebserver [-b bind address] [-p port] [-d directory]
[-o none|info|verbose] [-h to show options]
[-version to show version information]
オプション:
-b, --bind-address - バインド先アドレス。デフォルト: 127.0.0.1 (ループバック)。
すべてのインタフェースで"-b 0.0.0.0"または"-b ::"を使用します。
-d, --directory - 使用するディレクトリ。デフォルト: 現在のディレクトリ。
-o, --output - 出力形式。none|info|verbose。デフォルト: info。
-p, --port - リスニングするポート。デフォルト: 8000。
-h, -?, --help - ヘルプ・メッセージを出力して終了します。
-version, --version - バージョン情報を出力して終了します。
サーバーを停止するには、[Ctrl]+[C]を押します。
長年バグが残っていた理由
なぜJDK 18でJEP 408: Simple Web Serverとして導入されてから、JDK 25で修正される数年に渡ってこのようなバグが残ったままだったのでしょうか。そこには3つの理由があります。
理由① jwebserverがほとんど使われていない
JDK 18で導入された当初は新機能ということである程度の注目があったはずで、新機能の1つとして紹介している当時の記事はいくつか見つかります。しかし、それ以降はあまり記事が書かれていません。
では、JDK 18の新機能として紹介する記事を書いた人は、使ってみたとき人は文字化けに気が付かなかったのでしょうか。
実は、JDK 18のときは文字化けが発生していなかったのです。見てみましょう。
>%JDK18%\bin\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.
出力の通り、ヘルプメッセージが日本語にローカライズされていなかったのです。
JDK 19で取り込まれたJDK-8280400という修正で日本語にローカライズされ、このときから、文字化けが発生するようになりました。
つまり、導入当初に新機能として注目度が高かった時は文字化けが発生しておらず、ほとんど使われなくなった次のバージョンから文字化けが発生していたのです。
使われていないから、現象が発見されなかったと考えられます。
理由② 発生する環境が限定的
jwebserverのメッセージがローカライズされているのは、日本語、中国語、ドイツ語のみです。それ以外の言語の場合は、デフォルトとして英語でメッセージが出力されます。
そのローカライズされた3つの言語のWindows環境でのみ、文字化けは発生していました。
中国語、ドイツ語での検証はしていません。ソースコードからの推測です。
ローカライズの状況は、OpenJDKのソースコードにあるプロパティファイルの有無をみればわかります。
/src/jdk.httpserver/share/classes/sun/net/httpserver/simpleserver/resources
Javaは多くの言語圏で使用されていますが、あらゆる言語でローカライズされているわけではありません。ローカライズされている数少ない言語でしか発生しないことから、発見されなかったと考えられます。
理由③ OpenJDKでローカライズされた言語の出力を検証するテストがない
今回のjwebserverのヘルプの出力について、英語環境での出力を検証するテストはあります。
ですが、ローカライズされている日本語や中国語、ドイツ語での出力を検証するテストはないのです。
JDKベンダーは、自分たちがサポートする実行環境で自分たちがビルドしたJDKバイナリに対してOpenJDKのテストを実行し、サポートする実行環境でJDKが問題なく動作することを確認します。
例えば、日本語のWindowsで動作することをサポートしているベンダーは、日本語のWindowsでテストをします。しかし、テストに日本語の出力を検証するテストがないので、jwebserverのメッセージが文字化けすることに気づくことができません。
この件に限らず、OpenJDKでは、英語以外の環境でのテスト走行が保証されていません。
テストガイドラインには、USロケール以外ではテストが失敗する可能性があるから、USロケールに設定を変えて走行するようにとあります。
まとめ
ローカライズに関する問題はそのロケールを使っているひとしか気づくことができません。
問題を見つけた場合は、Javaバグレポートサイトで報告をすれば修正されるかもしれません。この報告のハードルが高いと感じる場合は、私個人にご報告いただくことで修正することができるかもしれません。お気軽にXでご連絡ください。
Xアカウント:https://x.com/tbtdis
※これは私個人の見解で、所属する組織の公式見解ではありません