Не могу заставить Gradle использовать System.in

Этот вопрос объясняет, как использовать System.in при запуске задачи для запуска определенного класса в проекте.

Но для меня в настоящее время это не работает: хотя я включил application плагин и следующие строки в build.gradle:

mainClassName = "misc.StreamsExp"
run{ 
    standardInput = System.in 
}
task stream( type: JavaExec, dependsOn: assemble ){
    classpath sourceSets.main.runtimeClasspath
    main = "misc.StreamsExp"
}

линия с readLine в коде приложения ниже должна быть блокировка, но это не так:

BufferedReader br = new BufferedReader(new InputStreamReader( System.in ));

String enteredLine = "";
while( enteredLine == null || ! enteredLine.equals( "q" )){
    System.out.println( "spuds");
    enteredLine = br.readLine();
}

... вместо этого вещь вращается навсегда

мотыги
мотыги
мотыги
...

NB Я нахожусь на ОС Windows 10 с Java 8.91. Я пробовал и консоль Windows DOS и Cygwin.
NB2 То же самое происходит, когда я запускаю это stream задача внутри Eclipse (плагин Gradle STS Eclipse)... но не тогда, когда я делаю Run as --> Java application: тогда блокировка происходит, как и ожидалось.

1 ответ

Решение

Ха... один из тех, кто думает, что ты навсегда останешься в тупике и найдешь решение через 2 минуты после публикации в SO! Я оставлю это здесь для всех остальных...

Ответ должен поставить линию standardInput = в задании, которое вы выполняете, вот так:

task stream( type: JavaExec, dependsOn: assemble ){
    standardInput = System.in
    classpath sourceSets.main.runtimeClasspath
    main = "misc.StreamsExp"
}

Странно, но за подсказкой "spuds" в терминале Windows DOS

> Строительство 88% >: поток

... которая является известной "ошибкой", упомянутой в вопросе, на который я ссылался. В Cygwin такой ошибки не бывает.

CAVEAT: это работает в терминале Windows DOS и терминале Cygwin... это НЕ решает проблему при запуске на заказ stream задание в Eclipse!

Другие вопросы по тегам