Javaでは、_os.name
_のプロパティ値を確認して、基になるオペレーティングシステムの名前System.getProperty("os.name")
を知ることができます。
Windowsの各エディションでは、常にOSの正確な名前を返していました。XPでは_Windows XP
_、Vistaでは_Windows Vista
_、Sevenでは_Windows 7
_、8.1では_Windows 8.1
_、等々...
問題は、リリースされたMicrosoftアップデーターを使用してWindows 8.1をWindows 10に更新したところです。このプロパティはまだ_Windows 8.1
_のままです。
_public class OSTest {
public static void main(String[] args) {
System.out.println(System.getProperty("os.name"));
}
}
_
これを回避するにはどうすればよいですか?そして、Windows 10の新しいコピーをインストールする場合、つまり、このバグはMicrosoftの自動アップデーターが原因である場合、この問題が解決しないかどうか誰もが知っていますか?
これは既知の問題です JDK-8066504 これは今後のJava 8アップデート60で修正されました。
その理由は、 GetVersionEx 関数がWindows 8.1以降でその動作を変更したためです。
考えられる回避策は複数あります。 MSDNの記事 を参照してください。
簡単な方法は、cmd.exe /c ver
を実行することです。
もう1つは、システムファイルの1つのバージョン情報を調べることです。 kernel32.dll
。
これは間違いなく既知のバグです。これは、os.name
プロパティがWindows APIのソースコードのGetVersionEx
から値を取得するために発生します。 GetVersionEx
ただし、
windows 8.1以降のリリースでは変更されたり、利用できなくなる可能性があります
Microsoftの公式Webサイトによる。代わりに、IsWindows10OrGreater
ファイルのVersion Helper API関数にあるversionhelpers.h
を使用する必要があります。おそらくご想像のとおり、このファイルはJavaファイルではなく、Cで記述されています。そのため、多少の迂回方法で含める必要があります。動作します(JNIでプログラミングする必要があります:/)が、 このチュートリアル が役立ちます。別の解決策が このバグログ に表示され、必要な労力が少なくなります。
私は同じ問題に直面し、次の回避策を使用しました:cmdコマンド "systeminfo"は、OSの正しい名前である "OS Name:"を返し、このために次の関数を記述しました。
private boolean os2k10Check()
{
try{
Process p = Runtime.getRuntime().exec("systeminfo"); /*Execute cmd command "systeminfo"*/
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while (true)
{
line = r.readLine();
if (line == null) { break; }
if(line.contains("OS Name:")) /*If output contains OS Name and 2010*/
{
if(line.contains("2010"))
return true;
else
return false;
}
}
}
catch(Exception e)
{System.out.println("Platform Type: os2010check: exception"+e);}
return false;
}
うーん...それがWindows 10の修正かどうかわかりません(10.0.17134.590
)またはJava 8(1.8.0_171-b11
私にとっては)、しかし今は正しい:os.name
は私にWindows 10
。
また、信頼できない場合は、os.version
。私は持っています 10.0
。
(ところで、私はos.Arch:AMD64
。これはOSではなくJVMのものです。 )