Как программно определить операционную систему на Java?

есть mail.exampleserver.com существует ??? , если не попробовать следующий код (у вас должна быть учетная запись gmail)

$mail->SMTPSecure = "ssl";  
$mail->Host='smtp.gmail.com';  
$mail->Port='465';   
$mail->Username   = 'you@gmail.com'; // SMTP account username
$mail->Password   = 'your gmail password';  
$mail->SMTPKeepAlive = true;  
$mail->Mailer = "smtp"; 
$mail->IsSMTP(); // telling the class to use SMTP  
$mail->SMTPAuth   = true;                  // enable SMTP authentication  
$mail->CharSet = 'utf-8';  
$mail->SMTPDebug  = 0;   
469
задан Naman 8 May 2019 в 11:34
поделиться

6 ответов

Можно использовать:

System.getProperty("os.name")

P.S. Можно найти этот код полезным:

class ShowProperties {
    public static void main(String[] args) {
        System.getProperties().list(System.out);
    }
}

Все, что это делает, распечатывают все свойства, обеспеченные Вашими реализациями Java. Это даст Вам общее представление о том, что можно узнать о среде Java через свойства.:-)

574
ответ дан Chris Jester-Young 8 May 2019 в 11:34
поделиться

Если Вы интересуетесь тем, как проект с открытым исходным кодом действительно наполняет как это, можно проверить Терракотовый класс (Os.java), который обрабатывает этот спам здесь:

И Вы видите подобный класс для обработки версий JVM (Vm.java и VmVersion.java) здесь:

9
ответ дан Community 8 May 2019 в 11:34
поделиться

Октябрь 2008:

я рекомендовал бы кэшировать его в статической переменной:

public static final class OsUtils
{
   private static String OS = null;
   public static String getOsName()
   {
      if(OS == null) { OS = System.getProperty("os.name"); }
      return OS;
   }
   public static boolean isWindows()
   {
      return getOsName().startsWith("Windows");
   }

   public static boolean isUnix() // and so on
}

Тот путь, каждый раз, когда Вы просите OS, Вы не выбираете свойство несколько раз во время жизни Вашего приложения.

<час>

февраль 2016: 7 + несколько лет спустя:

существует ошибка с Windows 10 (который не существовал во время исходного ответа).
См." “os.name” Java для Windows 10? "

74
ответ дан Community 8 May 2019 в 11:34
поделиться

Я нахожу, что ОС Utils от Swingx делает задание.

6
ответ дан Daniel 8 May 2019 в 11:34
поделиться

Все вышеупомянутые ответы подвержены фатальному дефекту в рамках дизайна System#getProperty подпрограмма!

Никогда не доверяют os.name, os.version, и os.arch свойства. Эти свойства на самом деле не только для чтения , поскольку можно было бы ожидать — вместо этого, взломщик может легко ввести литерал произвольной строки в них!

, Например, на моем машина Windows 10 следующая часть кода на самом деле распечатала бы строковый литерал "Linux" при выполнении этих шагов:

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

Теперь, после упаковки class в исполняемый файл JAR, мы можем на самом деле идти вперед и выполнить его как показанный внизу.

$ Java - банка PATH.jar-Dos.name = "Linux"

Таким образом, весь ответы выше могли бы рискнуть Вашей программой, думая, что это выполняется на совершенно неправильный ОС . Вы могли бы спросить себя теперь, как можно было бы пойти о решении этого вопроса? Ну, по состоянию на время, будучи, единственный способ исправить этот контроль состоит в том, чтобы вручную проверить параметры JVM во время выполнения.

Вот короткий пример того, как запросить эти свойства программно. Предположим, что Вы добавили бы static блок инициализации к Вашему основному устройству class. Затем следующая часть кода препятствовала бы тому, чтобы любой вмешался os.name свойство внешне.

if (java.util.Arrays.toString(jdk.internal.misc.VM.getRuntimeArguments()).contains("Dos.name"))
{
    throw new java.lang.InternalError("Please refrain from tampering with the \"os.name\" property.");
}

jdk.internal.misc.VM class не предназначается для [1 113] использование. Поэтому Вы не должны использовать его в производственном коде!

2
ответ дан 22 November 2019 в 22:39
поделиться

Как указано в других ответах, System.getProperty предоставляет необработанные данные. Однако компонент Apache Commons Lang предоставляет оболочку для java.lang.System с удобными свойствами, такими как SystemUtils.IS_OS_WINDOWS , очень похожими на вышеупомянутую утилиту ОС Swingx.

142
ответ дан 22 November 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: