une partie de mon code échouait en x64, je commence à creuser, ce qui est dû à un code qui appelle des choses natives via Runtime.getRuntime (). exec () ...
Mais ce code a probablement quelques années, il ne prend pas en compte les nouveaux systèmes d'exploitation, et une partie du code ressemble à ceci:
String osName = System.getProperty("os.name");
if (osName.equals("Windows NT") || osName.equals("Windows 2000") || osName.equals("Windows XP")) {
cmd = new String[3];
cmd[0] = WINDOWS_NT_2000_COMMAND_1;
cmd[1] = WINDOWS_NT_2000_COMMAND_2;
cmd[2] = command;
} else if (osName.equals("Windows 95") || osName.equals("Windows 98") || osName.equalsIgnoreCase("Windows ME")) {
cmd = new String[3];
cmd[0] = WINDOWS_9X_ME_COMMAND_1;
cmd[1] = WINDOWS_9X_ME_COMMAND_2;
cmd[2] = command;
Je souhaite résoudre ce problème pour tous les nouveaux systèmes d'exploitation (w2008, Windows 7, ...), mais je n'ai pas accès à un hôte de chaque type et je ne souhaite pas installer dans un VM. Juste pour voir la valeur, quelqu'un connaît-il une liste quelque part? Je n'en ai pas encore trouvé.
EDIT: J'aurais besoin de: Windows 7, Windows 2003, Windows 2008, Windows 2008R2 En outre, je ne suis pas le 1.6u18, donc ne vous inquiétez pas du bogue mentionné par certains types.
Très probablement, vous pourriez changer le code pour dire
if (osName.equals("Windows 95") || osName.equals("Windows 98") || osName.equalsIgnoreCase("Windows ME")) {
cmd = new String[3];
cmd[0] = WINDOWS_9X_ME_COMMAND_1;
cmd[1] = WINDOWS_9X_ME_COMMAND_2;
cmd[2] = command;
}
else {
cmd = new String[3];
cmd[0] = WINDOWS_NT_2000_COMMAND_1;
cmd[1] = WINDOWS_NT_2000_COMMAND_2;
cmd[2] = command;
}
Bien que cette solution ne soit pas complète, vous pouvez vous procurer un JDK 32 bits et exécuter une simple impression de code os.name
et os.version
avec différents paramètres de compatibilité.
Voici les valeurs de os.name
/os.version
rapportées par différents JDK sur un Windows 8.1 box:
╔═════════════════╤════════════╤════════════╤ ════════════╤═══════════════╤═══════════════╤═════ ═════════════════╤══════════════════════╗ ║ Java/OS version │ Windows 95 │ Windows 98 │ Windows XP │ Windows Vista Windows 7 Windows 8 Windows 8.1 ──┼────────────┼────────────┼────────────┼──────── ───────┼───────────────┼──────────────────────┼─── ───────────────────╢ ║ 1.4.2 Windows 95 │ Windows 98 │ Windows XP Windows Vista Windows Vista Windows Vista Windows Vista │ 4.0 │ 4.10 5.1 6.0 │ 6.1 6.2 │ 6.2 ║ 1.5.0 Windows 95 │ Windows 98 │ Windows XP Windows Vista Windows 7 Windows NT (inconnu) Windows NT (inconnu) ║ │ 4.0 │ 4.10 5.1 6.0 6.2 6.2 1.6.0 Windows 95 Windows 98 │ Windows XP Windows Vista Windows 7 │ Windows 8 Windows 8 4.0 │ 4.10 5.1 │ 6.0 6.1 6.2 6.2 1.7.0 1.7 Windows 95 │ Windows 98 │ Windows XP Windows Vista │ Windows 7 Windows 8 │ Windows 8.1 4.0 │ 4.10 │ 5.1 │ 6.0 6.1 6.2 6.3 ║ 1.8.0 Windows 95 │ Windows 98 │ Windows XP Windows Vista │ Windows 7 Windows 8 Windows 8.1 │ 4.0 │ 4.10 5.1 │ 6.0 6.1 6.2 6.3 ═════════╧════════════╧═══════════════╧═══════════ ════╧══════════════════════╧═ ═════════════════════╝
Je me suis occupé de cela chez Symantec quand Visual Cafe était encore en vie ... Je ne recommande pas de le faire de cette façon. Le problème est que différents fournisseurs peuvent fournir différentes chaînes. Je suggère d'utiliser un moyen spécifique au système d'exploitation pour déterminer la plate-forme.
Vous pouvez utiliser l'utilitaire "ver" sous Windows et "uname" sur les systèmes de type Unix.
Il serait peut-être préférable d'utiliser "GetNativeSystemInfo" sous Windows, mais cela nécessiterait du code natif.
La raison pour laquelle je suggère cette méthode plutôt que de s'appuyer sur la méthode System.getProperty est que vous devez alors uniquement traiter le système d'exploitation sous-jacent au lieu de la machine virtuelle située au-dessus du système d'exploitation - et cela élimine le problème suivant: la même plate-forme.
EDIT: Évidemment, vous devrez essayer différentes manières d'obtenir les informations, car certaines d'entre elles peuvent nécessiter l'exécution du shell au lieu de la simple commande. Mais si vous vous en tenez à bash, ça devrait être bien. Essentiellement, essayez d’exécuter des commandes jusqu’à ce que l’une d’entre elles fonctionne ... Ce n’est pas beau, mais ça marche.
Pas de liste, mais sous Windows7, avec un JDK6_u18:
os.name
= "Windows 7"
Remarque: il y avait un bogue sur JFK6_u14 et avant , où il affichait:
"Windows Vista" au lieu de "Windows 7" (même si le système d'exploitation était en fait "Windows 7"), alors faites attention!
Selon ce HowTo , il devrait s'agir de "Windows 2003" pour W2003.
Comme les nouvelles versions doivent nécessiter ce que la ligne NT requiert, il peut s'avérer plus judicieux de rechercher les anciennes versions et d'utiliser les paramètres NT au lieu de rechercher les versions les plus récentes, par exemple:
String osName = System.getProperty("os.name");
if (osName.equals("Windows 95") || osName.equals("Windows 98")
|| osName.equalsIgnoreCase("Windows ME")) {
cmd = new String[3];
cmd[0] = WINDOWS_9X_ME_COMMAND_1;
cmd[1] = WINDOWS_9X_ME_COMMAND_2;
cmd[2] = command;
} else {
cmd = new String[3];
cmd[0] = WINDOWS_NT_2000_COMMAND_1;
cmd[1] = WINDOWS_NT_2000_COMMAND_2;
cmd[2] = command;
}
Dépend de la version de Java que vous utilisez, je suis tombé sur ce bogue:
http://bugs.Sun.com/view_bug.do?bug_id=6819886
aussi longtemps que vous utiliserez une dernière version du JDK, il devrait renvoyer Windows 7 tout va bien.
Je ne sais pas si je suis sûr de Windows Server 2008 Windows Server 2008 .
Il y a une liste assez complète ici:
Ce code vous donnera le dernier nom du système d'exploitation Windows comme "Windows Server 2016"
public static String getFullOSName() {
String cmds ="systeminfo";
String osName = null;
try {``
BufferedReader bufferedreader = executeCommand(cmds);
String line;
while ((line = bufferedreader.readLine()) != null) {
if (line.contains("OS Name")) {
String services[] = line.split(":");
osName = services[1].trim();
return osName;
}
}
} catch (Exception ex) {
}
return osName;
}
/**
* Execute Command
*
* @param command
* @return
* @throws Exception
*/
private static BufferedReader executeCommand(String command) throws Exception {
BufferedReader bufferedreader = null;
try {
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
bufferedreader = new BufferedReader(inputstreamreader);
} catch (Exception ex) {
throw new Exception("Command Execution failed on windows. command = " + command);
}
return bufferedreader;
}