Могу ли я узнать, была ли Java-программа запущена с использованием java или javaw? - PullRequest
8 голосов
/ 18 марта 2010

Это связано с более ранним вопросом другого пользователя, спрашивающим Как обнаружить, что код выполняется внутри IDE затмения .

Я заметил, что Eclipse всегда запускает программы с javaw вместо java. (Это не означает, что программа, запущенная с javaw, была запущена из Eclipse).

Я могу найти аргументы, переданные с помощью

RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean();
List<String> lst = RuntimemxBean.getInputArguments();
for (int i = 0; i < lst.size(); i++)
    System.out.println(lst.get(i));

Но это не говорит мне, был ли он запущен с использованием java или javaw.

  1. Есть ли способ узнать, был ли он запущен с использованием java или javaw?
  2. Почему Eclipse использует javaw для запуска программ?

Ответы [ 3 ]

6 голосов
/ 18 марта 2010

System.console () вернет null, поскольку единственное различие между использованием java и javaw заключается в том, что для javaw нет ассоциированного окна консоли.

Вот небольшая тестовая программа, которую вы можете использовать, чтобы продемонстрировать, что:

import javax.swing.JOptionPane;
public class ConsoleTest {
    public static void main(String[] args) {
        if (System.console() == null) {
            JOptionPane.showMessageDialog(null, "System.console() is null");
        } else {
           JOptionPane.showMessageDialog(null, "System.console() is not null");
        }
    }
}

Однако при запуске из Eclipse System.console() все равно вернет null, даже если запущено с java.

В конфигурации запуска Eclipse на вкладке JRE, если вы измените JRE среды выполнения на Альтернативный JRE , вы сможете затем изменить исполняемый файл Java с javaw на java.

4 голосов
/ 10 декабря 2012

Проверка на System.console () не работает для меня из-за:

  1. Требуется JDK 6 или более поздняя версия
  2. Объект консоли также отсутствует, если приложение запускалось с помощью метода Runtime.exec (String) . Это было очень важно для меня, потому что мы использовали много автоматизированных сценариев.

Итак, я использую следующее решение:

private static boolean isJavaw() {
  try {
    System.in.available();
    return false;
  } catch (IOException e) {
    // invalid handle in case of javaw
    return true;
  }
}

Прекрасно работает с JDK 5, 6 и 7.

1 голос
/ 18 марта 2010

Есть ли способ узнать, был ли он запущен с использованием java или javaw?

В соответствии с документацией : команда javaw идентична java, за исключением того, что с javaw нет связанного консольного окна. Используйте javaw, когда вы не хотите, чтобы отображалось окно командной строки. Однако в случае запуска запуска по какой-либо причине запуск приложения javaw будет отображать диалоговое окно с информацией об ошибке.

Почему Eclipse использует javaw для запуска программ?

  1. Чтобы перейти с javaw на java:

    1. Откройте конфигурацию запуска, выбрав «Run» -> «Run ...» в меню бар.
    2. Выберите конфигурацию запуска вашего приложения.
    3. Перейти на страницу «JRE».
    4. Снимите флажок «Использовать исполняемый файл Java по умолчанию»
    5. Введите «java» вместо «javaw».
  2. Я думаю, потому что разработчики Eclipse разрабатывают приложения с графическим интерфейсом, и им не нужно консольное окно.

...