Вопрос

Я использую 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"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top