Windows8でJavaのos.versionが「Windows NT (unknown)」になる件

(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

「Windows8でJavaのos.versionが「Windows NT (unknown)」になる件」への2件のフィードバック

  1. 情報ありがとうございます。2012/10/31現在の6系最新版が6u37なので、次のバグフィックスリリース時に開放されそうですね。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください