поддержка java.io.Console в Eclipse IDE
Вопрос
Я использую Eclipse IDE для разработки, компиляции и запуска своих Java-проектов.Сегодня я пытаюсь использовать java.io.Console
класс для управления выводом и, что более важно, пользовательским вводом.
Проблема в том, что System.console()
ВОЗВРАТ null
когда приложение запускается "через" Eclipse.Eclipse запускает программу в фоновом процессе, а не в процессе верхнего уровня с окном консоли, с которым мы знакомы.
Есть ли способ заставить Eclipse запускать программу как процесс верхнего уровня или, по крайней мере, создать консоль, которую распознает JVM?В противном случае я вынужден запустить проект в среде командной строки, внешней по отношению к Eclipse.
Решение
Я предполагаю, что вы хотите иметь возможность использовать пошаговую отладку из Eclipse.Вы можете просто запустить классы извне, установив встроенные классы в каталогах bin в пути к классам JRE.
java -cp workspace\p1\bin;workspace\p2\bin foo.Main
Вы можете выполнять отладку с помощью удаленного отладчика и используя преимущества файлов классов, встроенных в ваш проект.
В этом примере структура проекта 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.Тот Самый приостановить=y аргумент указывает JVM подождать, пока подключится отладчик.
2.Создайте конфигурацию запуска отладки
В Eclipse откройте диалоговое окно отладки (Выполнить > Открыть диалоговое окно отладки ...) и создайте новый Удаленное Java-приложение конфигурация со следующими настройками:
- Проект: название вашего проекта
- Тип подключения: Стандартный (Для подключения к розетке)
- Ведущий: локальный хост
- Портвейн: 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();
Причина, по которой это происходит, заключается в том, что eclipse запускает ваше приложение как фоновый процесс, а не как процесс верхнего уровня с системной консолью.
Вы можете реализовать класс самостоятельно.Ниже приведен пример:
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);
}
}
Нашел кое-что об этом по адресу http://www.stupidjavatricks.com/?p=43 .
И, к сожалению, поскольку console является окончательной, вы не можете расширить ее, чтобы создать оболочку вокруг system.in и system.out, которая тоже это делает.Даже внутри консоли eclipse у вас все еще есть к ним доступ.Вероятно, именно поэтому eclipse еще не подключила это к своей консоли...
Я понимаю, почему вы не хотели бы иметь какой-либо другой способ получить консоль, отличную от System.console, без установщика, но я не понимаю, почему вы не хотели бы, чтобы кто-то мог переопределить класс для создания консоли макета / тестирования...
Другой вариант - создать метод для объединения обоих параметров и "переключиться" на метод 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;
}
Насколько я могу судить, нет способа получить консольный объект из Eclipse.Я бы просто убедился, что console != null, затем вызвал его и запустил из командной строки.
Кажется, нет способа получить объект java.io.Console при запуске приложения через Eclipse.Окно консоли командной строки не открывается вместе с приложением, поскольку оно запускается как фоновый процесс (фон для Eclipse?).В настоящее время нет плагина Eclipse для решения этой проблемы, в основном из-за того, что java.io.Console является конечным классом.
Все, что вы действительно можете сделать, это проверить возвращаемый консольный объект на null и продолжить оттуда.
Это Ссылка предлагает альтернативы использованию System.console().Первый - использовать BufferedReader, обернутый вокруг System.in, второй - использовать сканер, обернутый вокруг System.in.
Ни один из них не такой лаконичный, как console, но оба работают в eclipse без необходимости прибегать к отладочным глупостям!
Допустим, ваше рабочее пространство Eclipse - C:\MyWorkspace, вы создали свое java-приложение внутри проекта maven MyProject, а ваш основной класс Java - com.mydomain.mypackage .MyClass.
В этом случае вы можете запустить свой основной класс, который использует System.console()
в командной строке:
java -cp C:\MyWorkspace\MyProject\target\classes com.mydomain.mypackage.MyClass
NB1:если этого нет в проекте maven, проверьте выходную папку в свойствах проекта | Java Build Path | Source.Это может быть не "цель / классы".
NB2:если это проект maven, но ваш класс находится в src / test / java, вам, вероятно, придется использовать "target est-classes" вместо "target \ classes"