web-dev-qa-db-fra.com

"Os.name" de Java pour Windows 10?

En Java, nous pouvons voir la valeur de la propriété os.name Pour connaître le nom du système d'exploitation sous-jacent: System.getProperty("os.name").

Pour chaque édition de Windows, il retournait toujours le nom exact du système d'exploitation: Windows XP Pour XP, Windows Vista Pour Vista, Windows 7 Pour Seven, Windows 8.1 pour 8.1, et ainsi de suite ...

Le problème est le suivant: je viens de mettre à jour Windows 8.1 vers Windows 10 à l'aide du programme de mise à jour de Microsoft publié, et il semble que cette propriété reste toujours Windows 8.1:

public class OSTest {
  public static void main(String[] args) {
    System.out.println(System.getProperty("os.name"));
  }
}

Comment puis-je créer une solution de contournement pour cela? Et, est-ce que quelqu'un sait si ce problème persiste si on installe une nouvelle copie de Windows 10 - autrement dit, ce bogue est causé par le programme de mise à jour automatique de Microsoft -?

48
BloodShura

C’est un problème connu JDK-8066504 qui a été résolu dans les prochains Java 8 mise à jour 60.

La raison en est GetVersionEx La fonction a changé de comportement depuis Windows 8.1.

Il existe plusieurs solutions possibles, voir article MSDN .

Le plus simple est d'exécuter cmd.exe /c ver.

L'autre consiste à consulter les informations de version de l'un des fichiers système, par exemple. kernel32.dll.

43
apangin

C'est certainement un bug connu. Cela se produit parce que le os.name La propriété tire sa valeur de GetVersionEx dans le code source de l’API Windows. GetVersionEx cependant,

peut être modifié ou indisponible pour les versions ultérieures à Windows 8.1

Selon le site officiel de Microsoft. Au lieu de cela, nous devrons utiliser le IsWindows10OrGreater trouvé dans les fonctions de l'API Version Helper dans le versionhelpers.h fichier. Comme vous l'avez probablement deviné, ce fichier n'est pas un fichier Java, il est écrit en C. Il est donc nécessaire de l'inclure de manière un peu détournée. Il faut un peu travail (vous devez programmer dans JNI: /) mais ce tutoriel vous aidera à le faire. Une autre solution est présentée dans ce journal des bogues , et nécessite moins d’effort.

13
bpgeck

J'ai rencontré le même problème et utilisé la solution suivante: La commande cmd "systeminfo" renvoie "Nom de l'OS:", qui correspond au nom correct du système d'exploitation. Elle a pour cela écrit la fonction suivante:

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;
}
2

Hm ... Je ne sais pas s'il s'agit d'un correctif de Windows 10 (10.0.17134.590) ou de Java 8 (1.8.0_171-b11 pour moi), mais c’est correct maintenant: os.name Donne moi Windows 10.

En outre, si vous ne vous y fiez pas, vous pouvez vérifier os.version. J'ai 10.0.

(Au fait, je vois os.Arch:AMD64. Ceci est de la JVM, pas de l'OS. )

0
WesternGun