jdk.charsets モジュールはjava.base にない Charset を提供します。
このモジュールには、2バイト文字とIBM文字セットなどが含まれます。
このモジュールは明示的に指定しないとランタイムイメージに含まれないので、例えば windows-31j などを扱った場合に以下のような例外になります。
java.nio.charset.UnsupportedCharsetException: windows-31j
at java.base/java.nio.charset.Charset.forName(Unknown Source)
jdk.charsets モジュールを含めたい場合は、jlink コマンドの --add-modules オプションで指定します。
--add-modules jdk.charsets
Gradle で jlink プラグインを使用している場合は、以下のように options で指定します。
plugins {
// ...
id("org.beryx.jlink") version "3.1.1"
}
jlink {
options = listOf("--strip-debug", "--compress", "zip-0",
"--no-header-files", "--no-man-pages",
"--add-modules", "jdk.charsets")
// ...
}
- strip-debug: 出力イメージからデバッグ情報を取り除きます
- compress: リソースの圧縮を指定します
- no-header-files: ヘッダー・ファイルを除外します
- no-man-pages: マニュアル・ページを除外します
--compress で指定可能な値は、zip-[0-9] となっており、zip-0 は圧縮無しで、zip-9は最も高い圧縮率を提供します(デフォルトzip-6)。旧来は [0-2] で指定しており、0は圧縮なし、1は定数文字列共有、2 はzip-6と同等となっていましたが、現在は非推奨です。
Gradle で jlink プラグインについては以下を参照してください。