Java的Windows 10"os.name"?

Blo*_*ura 49 java operating-system jvm getproperty windows-10

在Java中,我们可以看到os.name知道底层操作系统名称的属性值:System.getProperty("os.name").

对于每个版本的Windows,它总是返回操作系统的确切名称:Windows XPXP,Windows VistaVista,Windows 7Seven,Windows 8.18.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"));
  }
}
Run Code Online (Sandbox Code Playgroud)

如何为此创建解决方法?而且,有人知道如果安装一个新的Windows 10副本这个问题是否仍然存在 - 也就是说,这个错误是由Microsoft自动更新程序引起的?

apa*_*gin 45

这是已知问题JDK-8066504,已在即将发布的Java 8更新60中得到修复.

原因是GetVersionEx函数改变了自Windows 8.1以来的行为.

有多种可能的解决方法,请参阅MSDN文章.

琐碎的是执行cmd.exe /c ver.

另一种是查看其中一个系统文件的版本信息,例如kernel32.dll.


bpg*_*eck 13

这绝对是一个已知的错误.之所以会发生这种情况,是因为该os.name属性从GetVersionExWindows API的源代码中获取其值.GetVersionEx然而,

Windows 8.1之后可能会更改或不可用于发布

根据微软的官方网站.相反,我们需要使用文件IsWindows10OrGreater中的Version Helper API函数中的found versionhelpers.h.正如您可能猜到的那样,此文件不是Java文件,而是用C语言编写的.因此,我们需要以稍微迂回的方式包含它.它确实需要相当多的工作(你需要在JNI中编程:/),但本教程将帮助你做到这一点.此错误日志中显示了另一种解决方案,并且确实需要更少的工作量.