jlink でカスタム・ランタイム・イメージ作成時には jdk.charsets モジュールも含めたい


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 プラグインについては以下を参照してください。

blog1.mammb.com