LoginSignup
3
3

More than 5 years have passed since last update.

軽量JREでUnsupportedCharsetExceptionが発生した時の対処法

Last updated at Posted at 2019-03-05

概要

配布用の軽量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
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3