Я использую Eclipse IDE для разработки, компиляции и запуска своих Java-проектов. Сегодня я пытаюсь использовать java.io.Console
класс для управления выводом и, что более важно, пользовательским вводом.
Проблема в том, что он System.console()
возвращается, null
когда приложение запускается «через» Eclipse. Eclipse запускает программу в фоновом режиме, а не в процессе верхнего уровня с окном консоли, с которым мы знакомы.
Есть ли способ заставить Eclipse запускать программу как процесс верхнего уровня или, по крайней мере, создать консоль, которую JVM распознает? В противном случае мне придется запустить проект и запустить его в среде командной строки, внешней по отношению к Eclipse.
System.out
иSystem.in
достаточно для моего варианта использования и отказался от использованияSystem.console()
.Ответы:
Я предполагаю, что вы хотите иметь возможность использовать пошаговую отладку из Eclipse. Вы можете просто запустить классы извне, установив встроенные классы в каталогах bin на пути к классам JRE.
Вы можете выполнять отладку с помощью удаленного отладчика и файлов классов, встроенных в ваш проект.
В этом примере структура проекта Eclipse выглядит так:
1. Запустите консоль JVM в режиме отладки.
debug.bat - это командный файл Windows, который следует запускать извне из консоли cmd.exe .
В аргументах порт отладки был установлен на 8787 . Приостановить = у аргумент сообщает JVM, чтобы ждать , пока отладчик атташе.
2. Создайте конфигурацию запуска отладки.
В Eclipse откройте диалоговое окно «Отладка» («Выполнить»> «Открыть диалоговое окно отладки ...») и создайте новую конфигурацию удаленного Java-приложения со следующими параметрами:
3. Отладка
Итак, все, что вам нужно делать каждый раз, когда вы хотите отлаживать приложение, это:
Вы можете отслеживать эту проблему в ошибке 122429 . Вы можете обойти эту проблему в своем приложении, используя уровень абстракции, как описано здесь .
источник
pause
в конец этого командного файла, чтобы вы могли видеть любые сообщения об ошибках, которые появляются перед его закрытием.Обходной путь, который я использую, - просто использовать System.in/System.out вместо Console при использовании Eclipse. Например, вместо:
Ты можешь использовать:
источник
IOException
, что не бросается в случаеConsole.readLine()
.Причина этого заключается в том, что eclipse запускает ваше приложение как фоновый процесс, а не как процесс верхнего уровня с системной консолью.
источник
Вы можете реализовать класс самостоятельно. Ниже приводится пример:
источник
Нашел кое-что об этом на http://www.stupidjavatricks.com/?p=43 .
И, к сожалению, поскольку консоль является финальной, вы не можете расширить ее, чтобы создать оболочку вокруг system.in и system.out, которая это делает. Даже внутри консоли eclipse у вас все еще есть к ним доступ. Вероятно, поэтому eclipse еще не подключил это к своей консоли ...
Я понимаю, почему вы не хотели бы иметь другой способ получить консоль, кроме System.console, без сеттера, но я не понимаю, почему вы не хотите, чтобы кто-то мог переопределить класс, чтобы сделать макет / тестирование консоли ...
источник
Другой вариант - создать метод для обертывания обоих вариантов и «отработки отказа» для метода System.in, когда консоль недоступна. Приведенный ниже пример является довольно простым - вы можете выполнить тот же процесс, чтобы завершить другие методы в консоли (readPassword, format) по мере необходимости. Таким образом, вы можете успешно запустить его в Eclipse, и когда он будет развернут, вы получите доступ к функциям консоли (например, сокрытию пароля).
источник
Насколько я могу судить, получить объект Console из Eclipse невозможно. Я бы просто убедился, что console! = Null, затем JAR-файл и запустил бы его из командной строки.
источник
Кажется, нет способа получить объект java.io.Console при запуске приложения через Eclipse. Окно консоли командной строки не открывается вместе с приложением, поскольку оно выполняется как фоновый процесс (фон для Eclipse?). В настоящее время не существует плагина Eclipse для решения этой проблемы, в основном из-за того, что java.io.Console является последним классом.
Все, что вы действительно можете сделать, это проверить возвращаемый объект Console на нуль и продолжить работу оттуда.
источник
Эта ссылка предлагает альтернативы использованию System.console (). Первый - использовать BufferedReader, обернутый вокруг System.in, второй - использовать Scanner, обернутый вокруг System.in.
Ни один из них не так лаконичен, как console, но оба работают в eclipse без необходимости прибегать к отладке глупостей!
источник
Допустим, ваше рабочее пространство Eclipse - это C: \ MyWorkspace, вы создали свое Java-приложение внутри проекта Maven MyProject, а ваш основной класс Java - com.mydomain.mypackage.MyClass.
В этом случае вы можете запустить свой основной класс, который использует
System.console()
в командной строке:NB1: если его нет в проекте maven, проверьте папку вывода в свойствах проекта | Путь сборки Java | Источник. Это может быть не «цель / классы»
NB2: если это проект maven, но ваш класс находится в src / test / java, вам, вероятно, придется использовать «target \ test-classes» вместо «target \ classes»
источник