(2012/10/31追記:Java 6系も6u38で問題が解消されます)
Windows 8の環境で、JavaのSystem.getProperty("os.name")
が「Windows NT (unknown)」と返ってくる(返ってきた)件についてメモ。
結論から書くと、Java 7のUpdate 6で修正されていて、正しく「Windows 8」の文字列が得られるようになっています。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7170169
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=2224977
ソースはこの辺です。
http://hg.openjdk.java.net/jdk7u/jdk7u-dev/jdk/rev/3562fc7500a4
Windows 8、つまりNTカーネル 6.2に対応する分岐が追加されています。
〜
if (ver.wProductType == VER_NT_WORKSTATION) {
switch (ver.dwMinorVersion) {
case 0: sprops.os_name = “Windows Vista”; break;
case 1: sprops.os_name = “Windows 7”; break;
case 2: sprops.os_name = “Windows 8”; break; // ★この辺
default: sprops.os_name = “Windows NT (unknown)”;
}
} else {
〜
Java 7 Update 5以前ではこの分岐が実装されていなかったので、defaultに入って「Windows NT (unknown)」と出力されていました。
Java 6以前には、現時点ではこの修正がバックポートされていません。(セキュリティバグというわけでもないので…)
将来のアップデートで取り込まれるかもしれませんが、古いJavaを使い続ける場合は留意してください。
匿名さんからの情報で、6u38で提供されるそうです。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=2230412
2012/10/31現在の6系最新版は6u37なので、この次に出るリリースで7系からめでたくバックポートされるようです。
Windowsのバージョンで動作が左右されるケースは少ないだと思いますが、もし必要な場合はos.versionで判定した方が無難だと思います。os.versionのほうは、古いJavaでも正しく「6.2」が得られます。
# この値を元にos.nameの分岐をかけているので、当たり前っちゃ当たり前ですが。
ちなみに、java_props_md.cの全体はこんなんです。
Windowsのバージョニングの系譜が見られて面白いというか、泥臭い判定というか…ですね。
http://hg.openjdk.java.net/jdk7u/jdk7u-dev/jdk/file/3562fc7500a4/src/windows/native/java/lang/java_props_md.c
コメントを残す