はじめに
"OpenJ9 0.51.0’s System.initProperties() — What Every Java Developer Should Know?"というブログ記事があります。今年5月にリリースされたSemeru Runtimes (OpenJ9 v0.51)からuser.languageなどのプロパティの初期化が変わったという内容ですが、実際に何がどう変わったのかを確認してみました。
結論から言うと、macOSを英語以外の設定で使っている場合は大きな変化がありましたが、macOSを英語設定で使っている人や他のOS (Windows, Linux)のユーザーにはほとんど影響がありません。
JavaとOpenJ9のバージョン対応
LTS (Long Term Support)になっているJavaのバージョンは現在8, 11, 17, 21の4つがあり、基本的に3ヶ月ごとに脆弱性の修正などが行われます。OpenJ9 v0.51は2025年第2四半期にリリースされた下記のJavaバージョンに対応します。
- Java 8: 8u452
- Java 11: 11.0.27
- Java 17: 17.0.15
- Java 21: 21.0.7
OpenJ9を採用しているSemeru Runtimesで下記のようにjava -version
を実行すると、build openj9-0.51.0
の部分にOpenJ9のバージョンが入っています。プロパティのjava.vm.version
でも確認できます。
% jdk-21.0.7+6/Contents/Home/bin/java -version
openjdk version "21.0.7" 2025-04-15 LTS
IBM Semeru Runtime Open Edition 21.0.7.0 (build 21.0.7+6-LTS)
Eclipse OpenJ9 VM 21.0.7.0 (build openj9-0.51.0, Jre 21 Mac OS X aarch64-64-Bit 20250415_442 (JIT enabled, AOT enabled)
OpenJ9 - 31cf5538b0
OMR - 9bcff94a2
JCL - 26c2dc3d801 based on jdk-21.0.7+6)
% jdk-21.0.7+6/Contents/Home/bin/java -XshowSettings -version 2>&1 | grep java.vm.version
java.vm.version = openj9-0.51.0
macOSの場合
以前のバージョンでは、OSの言語設定に関係なくuser.language = en
となっていました。v0.51からはuser.language
がOSの言語設定に従うようになり、日本語環境ではja
に変わりました。これにより、出力されるメッセージの言語が切り替わっています。
なお、file.encoding
はUTF-8
のままで変化はありません。
macOSの日本語環境で実行した例を示します。
% jdk-21.0.6+7/Contents/Home/bin/java -XshowSettings -version 2>&1 | grep language
user.language = en
% jdk-21.0.6+7/Contents/Home/bin/javac Foo.java
Foo.java:4: error: reached end of file while parsing
}
^
1 error
% jdk-21.0.7+6/Contents/Home/bin/java -XshowSettings -version 2>&1 | grep language
user.language = ja
% jdk-21.0.7+6/Contents/Home/bin/javac Foo.java
Foo.java:4: エラー: 構文解析中にファイルの終わりに移りました
}
^
エラー1個
また、以前はLANG
環境変数による指定がuser.language
などのプロパティに反映されていましたが、v0.51からはLANG
を無視するようになりました。
% LANG=fr_FR.UTF-8 jdk-21.0.6+7/Contents/Home/bin/java -XshowSettings -version 2>&1 | grep language
user.language = fr ← LANGに従ってフランス語に変わっている
% LANG=fr_FR.UTF-8 jdk-21.0.7+6/Contents/Home/bin/java -XshowSettings -version 2>&1 | grep language
user.language = ja ← OSの言語設定の日本語のまま
Linuxの場合
v0.51で変化はありません。LANG
環境変数に従います。
LANG
が設定されていない場合はuser.language = en
, user.country = US
, file.encoding = ANSI_X3.4-1968
となります。
Windowsの場合
こちらもv0.51でほとんど変化はありません。OSの言語設定に従い、日本語環境ではuser.language = ja
になります。
file.encoding
はJavaのバージョンによって異なり、Java 17以前ではfile.encoding = MS932
でしたが、Java 21以降ではfile.encoding = UTF-8
となっています。
他のOSの場合
AIXやz/OSについては確認していません。
まとめ
OpenJ9 v0.51でプロパティの初期化方法が変わり、英語以外の設定でmacOSを使っている場合は以前と挙動が変わります。LinuxやWindowsの場合は実用上違いはないと言っていいでしょう。