概要
配布用の軽量JREの作り方の記事でも紹介していますが、Java 9 以降では必要最低限のモジュールで構成された軽量JREを作ることができます。
JDKに付属の jdeps コマンドで軽量JREに含めるべき依存モジュールを知ることはできますが、作成した軽量JREでアプリを実行してみると以下の例外に遭遇することがあります。
UnsupportedCharsetException: EUC-JP
これはサポート外の文字コードを指定した場合に発生する例外となります。軽量JREではない通常のJDKでは発生していない例外ですが、jdeps コマンドで示された必要最低限のモジュールは含んでいるはずですが例外が発生してしまっています。
つまり、jdeps コマンドだけでは軽量JREに含めるべきモジュールが不十分ということになります。
本記事では軽量JREを使う際に上記の例外を回避する方法についてご紹介します。
なぜ例外が発生するのか
EUC-JP などの拡張文字コードは java.base モジュールに含まれていないためです。
ちなみに、JDK9 の jdk.charsets モジュールの Javadoc には以下のような記載があります。
java.base (主に2バイト文字とIBM文字セット)にないcharsetsを提供します。
つまり、日本語の文字コードセットは jdk.charsets モジュールを追加で指定する必要があるということです。
Java のソースコード内で以下のように Charset.forName メソッドなどを使用して文字コードを指定していると、jdeps コマンドでは jdk.charsets モジュールは表示されないため、軽量JREを作る際は注意が必要となります。
Charset.forName("EUC-JP")
対処法
jlink コマンドで軽量JREを作る際に jdk.charsets モジュールを含めることで拡張文字コードが扱えるようになります。
jlink --compress=2 --module-path ../jmods --add-modules java.base,jdk.charsets --output jre