часть моего кода перестала работать в x64, я начинаю рыть, и это происходит из-за некоторого кода, который называет собственный материал через Runtime.getRuntime () .exec ()...
Но этому коду, вероятно, некоторые годы, он не принимает во внимание более новую ОС, и часть кода похожа на это:
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;
Я хотел бы зафиксировать это для всего нового OSs (w2008, окна 7...), но у меня нет доступа к хосту каждого вида, и я не хочу устанавливать в VM только для наблюдения значения, кто-либо знает о некотором списке где-нибудь? не имейте находят любого все же.
Править: Мне было бы нужно: окна 7, окна 2003, окна 2008, окна 2008R2 кроме того, я не 1.6u18 так никакое беспокойство об ошибке, которую упомянули некоторые парни.
Скорее всего, вы могли бы изменить код, чтобы сказать
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;
}
Я имел дело с этим в Symantec, когда Visual Cafe был еще жив ... Я не рекомендую делать это вообще так. Проблема в том, что разные поставщики могут поставлять разные строки. Я бы предложил использовать специфический для ОС способ определения платформы.
Вы можете использовать утилиту «ver» в Windows и «uname» в системах типа Unix.
Возможно, лучше использовать GetNativeSystemInfo в Windows, но для этого потребуется собственный код.
Причина, по которой я предлагаю этот способ, а не полагаться на метод System.getProperty, заключается в том, что в этом случае вам нужно иметь дело только с базовой ОС, а не с JVM, находящейся поверх ОС - и это устраняет проблему, когда разные виртуальные машины сообщают разные вещи для одной и той же платформы.
РЕДАКТИРОВАТЬ: Очевидно, вам придется попробовать разные способы получения информации, поскольку для некоторых из них может потребоваться запуск оболочки, а не только команда. Но если вы придерживаетесь bash, все будет хорошо. В основном попробуйте запускать команды, пока одна из них не сработает ... некрасиво, но это сработает.
Нет списка, но в Windows7 с JDK6_u18:
os.name
= "Windows 7"
Примечание: была ошибка в JFK6_u14 и ранее , где отображалось:
«Windows Vista» вместо «Windows 7» (хотя ОС на самом деле была «Windows 7»), поэтому будьте осторожны!
Согласно this HowTo , это должна быть Windows 2003 для W2003.
В зависимости от версии Java, которую вы используете, я обнаружил эту ошибку:
http://bugs.sun.com/view_bug .do? bug_id = 6819886
, так что если вы используете последнюю версию JDK, она должна возвращать Windows 7 нормально.
Не уверен насчет Windows Server 2008, я предполагаю Windows Server 2008 .
Здесь достаточно полный список:
Поскольку новые версии должны требовать того же, что и строка NT, возможно, имеет смысл проверить старые версии и использовать настройки NT вместо проверки новых версий, примерно так:
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;
}