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上でバイナリを作成