naoki86star

インターネットの片隅でなにかしら書いてみる

jdeps , jdk.charsets

java 17、jlinkでカスタムJREを作ってコケたケースの話

とある hoge.jarで

jdeps --print-module-jdeps hoge.jar

で得られる出力で、runtime 環境を作成する

jlink --output=jre --strip-debug --no-header-files --no-man-pages \
 --module-path $JDK17_HOME/jmods --add-modules java.base,...

これで得られるjreでlinux上は動いてくれてた。のだが、macOSでは*1、コケる箇所があった。

Caused by: java.nio.charset.UnsupportedCharsetException: Windows-31J
        at java.base/java.nio.charset.Charset.forName(Unknown Source)
        at ************
        ... 17 more

とりあえず例外から原因推測するべく、$JAVA_HOME/jmodsの下と見比べてjdk.charsetsというのがjmodsコマンドの出力にはなかったのでjlinkの--add-moduleに足してみたら,,,うまくいっているようである。

hoge.jarの元のソースを俯瞰してみて、

new OutputStreamWriter(os, Charset.forName("Windows-31J"),

などとやってる箇所があり、これではjdepsも検出できなかろう、なのだろう。linuxはWindows-31Jをjava.baseかどれかに入れてくれているのかどうかわからないが、linuxで動いたのは単に幸運だったということだろう。

jlink時に、依存に関わらず絶対入れておく自分用経験上リストを持っておくのは心強くなる、そう思った。

*1:無論、macOS上でバイナリを作成