Поддержка java.io.Console в Eclipse IDE

Я использую Eclipse IDE для разработки, компиляции и запуска проектов Java. Сегодня я пытаюсь использовать class java.io.Console для управления выводами и, что более важно, ввода пользователем.

Проблема в том, что System.console() возвращает значение null когда приложение запускается «через» Eclipse. Eclipse запускает программу в фоновом режиме, а не в процессе верхнего уровня с консольным окном, с которым мы знакомы.

Есть ли способ заставить Eclipse запускать программу как процесс верхнего уровня или, по крайней мере, создать консоль, которую JVM узнает? В противном случае я вынужден запустить проект и запустить в среде командной строки, внешней по отношению к Eclipse.

Я предполагаю, что вы хотите использовать сквозную отладку из Eclipse. Вы можете просто запустить classы извне, установив встроенные classы в каталоги bin в пути classа JRE.

 java -cp workspace\p1\bin;workspace\p2\bin foo.Main 

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

В этом примере структура проекта Eclipse выглядит так:

 workspace\project\ \.classpath \.project \debug.bat \bin\Main.class \src\Main.java 

1. Запустите консоль JVM в режиме отладки

debug.bat – пакетный файл Windows, который должен запускаться извне из консоли cmd.exe .

 @ECHO OFF SET A_PORT=8787 SET A_DBG=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=%A_PORT%,server=y,suspend=y java.exe %A_DBG% -cp .\bin Main 

В аргументах для порта отладки установлено значение 8787 . Параметр suspend = y указывает JVM ждать, пока отладчик не подключится.

2. Создайте конфигурацию запуска отладки

В Eclipse откройте диалоговое окно «Отладка» («Выполнить»> «Открыть диалог отладки …») и создайте новую конфигурацию удаленного Java-приложения со следующими настройками:

  • Проект: название вашего проекта
  • Тип соединения: стандартный (гнездо для крепления)
  • Хост: localhost
  • Порт: 8787

3. Отладка

Итак, все, что вам нужно сделать, когда вы хотите отладить приложение, это:

  • установить точку останова
  • запуск командного файла в консоли
  • запустить конфигурацию отладки

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

Обходной путь, который я использую, – это просто использовать System.in/System.out вместо Console при использовании Eclipse. Например, вместо:

 String line = System.console().readLine(); 

Вы можете использовать:

 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); String line = bufferedReader.readLine(); 

Вы можете реализовать class самостоятельно. Ниже приведен пример:

 public class Console { BufferedReader br; PrintStream ps; public Console(){ br = new BufferedReader(new InputStreamReader(System.in)); ps = System.out; } public String readLine(String out){ ps.format(out); try{ return br.readLine(); }catch(IOException e) { return null; } } public PrintStream format(String format, Object...objects){ return ps.format(format, objects); } } 

Причина этого в том, что eclipse запускает ваше приложение как фоновый процесс, а не как процесс верхнего уровня с системной консолью.

Нашел что-то об этом на http://www.stupidjavatricks.com/?p=43 .

И, к сожалению, поскольку консоль окончательна, вы не можете расширять ее, чтобы создать оболочку aa вокруг system.in и system.out, которая это делает. Даже внутри консоли eclipse у вас есть доступ к ним. Вероятно, почему eclipse не подключил это в свою консоль еще …

Я понимаю, почему вы не хотели бы иметь другой способ получить консоль, отличную от System.console, без настройки, но я не понимаю, почему вы не хотите, чтобы кто-то мог переопределить class, чтобы сделать макет / тестовая консоль …

Другим вариантом является создание метода для обертывания обоих параметров и «сбой» метода System.in, когда консоль недоступна. Приведенный ниже пример довольно простой: вы можете выполнить один и тот же процесс, чтобы завершить другие методы в консоли (readPassword, format) по мере необходимости. Таким образом, вы можете успешно запустить его в Eclipse, и когда его развернут, вы получите нововведения консоли (например, скрытие пароля).

  private static String readLine(String prompt) { String line = null; Console c = System.console(); if (c != null) { line = c.readLine(prompt); } else { System.out.print(prompt); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); try { line = bufferedReader.readLine(); } catch (IOException e) { //Ignore } } return line; } 

Насколько я могу судить, нет способа получить объект Console из Eclipse. Я бы просто удостоверился, что console! = Null, а затем JAR и запустите его из командной строки.

Кажется, нет способа получить объект java.io.Console при запуске приложения через Eclipse. Окно консоли командной строки не открывается приложением, поскольку оно выполняется как фоновый процесс (фон Eclipse?). В настоящее время для этой проблемы нет плагина Eclipse, в основном из-за того, что java.io.Console является окончательным classом.

Все, что вы действительно можете сделать, это проверить возвращаемый объект консоли на null и перейти оттуда.

Эта ссылка предлагает альтернативы использованию System.console (). Один из них – использовать BufferedReader, обернутый вокруг System.in, второй – использовать сканер, обернутый вокруг System.in.

Они не столь же сжаты, как и консоль, но оба работают в eclipse, не прибегая к отладочной глупости!

Предположим, что ваше рабочее пространство Eclipse – это C: \ MyWorkspace, вы создали свое Java-приложение внутри проекта Maven MyProject, а ваш основной class Java – com.mydomain.mypackage.MyClass.

В этом случае вы можете запустить свой основной class, который использует System.console() в командной строке:

 java -cp C:\MyWorkspace\MyProject\target\classes com.mydomain.mypackage.MyClass 

NB1: если это не проект maven, проверьте выходную папку в свойствах проекта | Путь сборки Java | Источник. Это может быть не «цель / classы»,

NB2: если это проект maven, но ваш class находится в src / test / java, вам, скорее всего, придется использовать «target \ test-classes» вместо «target \ classes»,

Давайте будем гением компьютера.