Java+Eclipse: как вы отлаживаете Java-программу, которая получает piped/ перенаправленный стандартный ввод?
Я использую Eclipse для разработки Java-программы и решил добавить опцию в мою программу для анализа stdin, если нет аргументов. (иначе он анализирует файл)
У меня проблемы, если я выполню "somecommand | java -jar myjar.jar"
и пошел отлаживать... потом понял, что не знаю, как запустить процесс в Eclipse, как это. И если я запускаю его в командной строке, я не могу подключиться к запущенному процессу, так как процесс запускается немедленно.
Любые предложения о том, как отлаживать?
редактировать: видите, дело в том, что я написал свою программу изначально для аргумента имени файла. Затем я подумал, что было бы полезно также взять stdin, поэтому я абстрагировал InputStream от своей программы (как предлагает мистер Кью). Работает нормально, работает с файлом (java -jar myjar.jar myfile
), но не работает, когда я бегу type myfile | java -jar myjar.jar
, Я подозреваю, что в этих двух сценариях есть что-то другое (различается ли обнаружение?), Но я действительно хотел бы отладить.
// overall program structure follows:
public static void doit(InputStream is)
{
...
}
public static void main(String[] args)
{
if (args.length > 0)
{
// this leaves out the try-catch-finally block,
// but you get the idea.
FileInputStream fis = new FileInputStream(args[0]);
doit(fis);
fis.close();
}
else
{
doit(System.in);
}
}
4 ответа
Запустите ваше приложение с конвейером в командной строке, но добавьте аргументы JVM для удаленной отладки, например:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044
suspend=y
скажет JVM фактически не запускать программу, пока не подключен отладчик.
Далее перейдите в настройки запуска отладки Eclipse (Run -> Debug Configurations...
) и создайте "Удаленное Java-приложение" для подключения к вашему приложению. Запустите запуск в Eclipse (после установки некоторых точек останова), и вы сможете отладить. Не очень удобно, но если вы не можете воспроизвести свои проблемы без трубы, это вариант.
Если я правильно истолковываю ваш вопрос, я думаю, что вы просто хотите знать, как передавать входные данные через стандартный вход и отлаживать их в eclipse.
Если это простой ввод, вы можете вручную ввести данные System.in через окно консоли eclipse во время работы программы. Просто начните вводить текст в окне консоли и нажмите Enter, чтобы отправить текст в Standard in.
Если это что-то более сложное, я бы предложил абстрагировать чтение, которое вы пытаетесь сделать, чтобы получить InputStream. В вашей программе вы можете отправить System.in как InputStream. Для отладки вы можете отправить любой другой InputStream. Например, вы можете поместить свой ввод в файл и передать FileInputStream методу для его проверки.
РЕДАКТИРОВАТЬ: Не видя больше кода, я не уверен, но вы могли бы кое-что с обнаружением eof. FileInputStream имеет определенный конец файла, но я предполагаю, что System.in не имеет ничего подобного. Ваш читатель может просто ждать чтения следующего символа и никогда не продвигаться вперед. Возможно, вам придется вручную остановить чтение после того, как вы знаете, что прочитали "достаточно".
Я опоздал на вечеринку. Но вы можете найти "общую" вкладку в конфигурации отладки для вашего проекта. Там вы должны увидеть раздел "Стандартный ввод и вывод". Вы можете выделить консоль входными файлами и настроить выходные файлы таким образом.
Возможно, это решение создания именованного канала может быть применимо здесь.
mkfifo foo
somecommand > foo
Далее в конфигурации отладки добавьте < foo
в аргументах, так что ваша программа отлажена как:
java -jar myjar.jar