概要
配布用の軽量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