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

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

102 голосов
/ 19 сентября 2008

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

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

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

Ответы [ 10 ]

50 голосов
/ 20 сентября 2008

Полагаю, вы хотите использовать пошаговую отладку из 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 . Аргумент suspend = y указывает JVM подождать, пока отладчик не подключится.

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

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

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

3. Отладка

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

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

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

35 голосов
/ 20 декабря 2010

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

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

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

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = bufferedReader.readLine();
5 голосов
/ 21 марта 2013

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

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);
    }
}
5 голосов
/ 19 сентября 2008

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

4 голосов
/ 17 августа 2012

Другим вариантом является создание метода для объединения обоих параметров и «отработки отказа» для метода 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;
    }
4 голосов
/ 19 сентября 2008

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

И, к сожалению, так как console является окончательной, вы не можете расширить ее, чтобы создать оболочку для system.in и system.out, которая это делает. Даже внутри консоли затмения у вас все еще есть доступ к ним. Наверное, поэтому Eclipse еще не подключил это к своей консоли ...

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

2 голосов
/ 19 сентября 2008

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

1 голос
/ 11 июля 2012

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

Ни один из них не такой лаконичный, как консоль, но оба работают в затмении, не прибегая к отладочной глупости!

1 голос
/ 19 сентября 2008

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

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

0 голосов
/ 09 февраля 2017

Допустим, ваше рабочее пространство 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 | Источник. Это может быть не «цель / классы»

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...