java.io.Console підтримка в Eclipse IDE


103

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

Проблема полягає в тому, що System.console()повертається, nullколи програма запущена "через" Eclipse. Запустіть програму Eclipse у фоновому процесі, а не на найвищому рівні з вікном консолі, з яким ми знайомі.

Чи є спосіб змусити Eclipse запускати програму як процес вищого рівня або хоча б створити консоль, яку розпізнає JVM? В іншому випадку я змушений розгортати проект і запускатись в середовищі командного рядка, що знаходиться поза Eclipse.


Також дивіться stackoverflow.com/questions/26470972/…, який я виявив, System.outі System.inвін буде достатнім для мого випадку використання та абонентського використання System.console().
OneWorld

Я експортував проект як розгорнуту банку, але я все ще отримую нульову помилку консолі
Абгігян,

Відповіді:


50

Я припускаю, що ви хочете мати можливість використовувати поетапну налагодження від Eclipse. Ви можете просто запустити класи зовнішньо, встановивши вбудовані класи в бінні каталоги на шляху 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 відкрийте діалогове вікно налагодження (Запуск> Відкрити діалогове вікно налагодження ...) та створіть нову конфігурацію віддаленої програми Java з такими налаштуваннями:

  • Проект: назва вашого проекту
  • Тип з'єднання: Стандартний (Socket Attach)
  • Ведучий: localhost
  • Порт: 8787

3. Налагодження

Отже, все, що вам потрібно зробити, коли ви хочете налагодити додаток, це:

  • встановити точку перерви
  • запустити пакетний файл у консолі
  • запустити конфігурацію налагодження

Ви можете відстежити цю проблему в помилці 122429 . Ви можете подолати цю проблему у своїй програмі, використовуючи шар абстрагування, як описано тут .


1
Я також поставив би pauseв кінці цього пакетного файлу, щоб ви могли бачити будь-які повідомлення про помилки, що спалахують, перш ніж він закриється.
Метт Лайонс

10
Це остання солома для мене. Якщо мені доведеться зробити все це просто для налагодження, я переходжу назад на Netbeans. Стільки нефіксованих помилок та роздратованих інтерфейсів у Eclipse, що це навіть не смішно.
nuzzolilo

@Nuzzolilo, це лише для віддаленої налагодження. Ви можете налагоджувати локальну помилку в затемненні без усього цього.
Лаплі Андерсон

35

Вирішення, яке я використовую, полягає в тому, щоб просто використовувати System.in/System.out замість консолі під час використання Eclipse. Наприклад, замість:

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

Ви можете використовувати:

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

20
Я не думаю, що ти зможеш читати паролі із маскуванням пароля таким чином.
Sualeh Fatehi

3
... і потрібно поводитися IOException, що не кидається у випадку Console.readLine().
dma_k

5

Причина цього відбувається в тому, що затемнення запускає вашу програму як фоновий процес, а не як процес вищого рівня з системною консоллю.


5

Ви можете реалізувати клас самостійно. Наведемо приклад:

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);
    }
}

4

Дізнайтеся про це на веб- сайті http://www.stupidjavatricks.com/?p=43 .

І, на жаль, оскільки консоль остаточна, ви не можете розширити її, щоб створити обгортку навколо system.in і system.out, що робить це і. Навіть всередині консолі затемнення ви все ще маєте доступ до них. Ось, можливо, затемнення затемнення ще не підключило це до консолі ...

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


4

Іншим варіантом є створення методу для завершення обох варіантів та "невдача" методу System.in, коли консоль недоступна. Наведений нижче приклад є досить базовим - ви можете дотримуватися того самого процесу, щоб завершити інші методи в консолі (readPassword, формат), як потрібно. Таким чином, ви можете запустити його щасливо в 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;
    }

2

Наскільки я можу сказати, немає ніякого способу отримати об’єкт Консолі від Eclipse. Я просто переконайтеся, що консоль! = Null, потім JAR її вгору та запустіть її з командного рядка.


1

Здається, немає можливості отримати об’єкт java.io.Console під час запуску програми через Eclipse. Вікно консолі командного рядка не відкривається разом із додатком, оскільки воно запускається як фоновий процес (фон Eclipse?). В даний час не існує плагіна Eclipse, який би вирішував цю проблему, головним чином через те, що java.io.Console - це заключний клас.

Все, що ви дійсно можете зробити, це перевірити повернутий об’єкт Console на null і продовжити звідти.


1

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

Вони не такі стислі, як консолі, але обидва працюють у затемненні, не вдаючись до налагодження глупоти!


0

Скажімо, ваша робоча область 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-class" замість "target \ class"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.