Groovy: JLine не ждет ввода Gradle
ОС: Windows 10, в основном использующая Cygwin.
Я собрал файл DummyMain.groovy примерно так:
@Grab(group='org.jline', module='jline', version='3.7.0')
class DummyMain {
static void main( args ) {
new DummyMain().go()
}
def go() {
def terminal = org.jline.terminal.TerminalBuilder.builder().jna( true ).system( true ).build()
terminal.enterRawMode()
def reader = terminal.reader()
int readInt = -1
while( readInt != 13 ) {
readInt = reader.read()
println "read |$readInt| class ${readInt.class.simpleName}"
println "reader class ${reader.class.simpleName}"
}
reader.close()
terminal.close()
}
}
Когда я запускаю это, идя groovy DummyMain
в своем собственном каталоге это работает как ожидалось и наполняет меня радостью: reader.read()
строка останавливается для следующего символа, а затем обрабатывает его (т. е. до того, как пользователь нажимает клавишу Enter, чтобы завершить строку).
Но когда я закомментирую @Grab
и поместите эту строку в build.gradle
:
compile 'org.jline:jline:3.7.0'
и попробуйте запустить этот файл, используя самый простой build.gradle
это терпит неудачу: while
цикл вращается бесконечно, не дожидаясь ввода пользователя, то есть бесконечно печатая "read |-1|...".
Эта ошибка ожидания происходит, если я использую консоль Cygwin или консоль Windows CMD для перехода gradle run
,
Из другой печатной строки я могу сказать, что читатель здесь класс NonBlockingInputStreamReader
во всех трех случаях (т.е. Gradle через Cygwin, Gradle через Windoze CMD или groovy
командная строка).
Тем не менее, я считаю, что если я сделаю gradle installDist
Полученная "распределенная" версия приложения работает нормально: отвечает на каждый введенный символ и ждет следующего. Слава Богу за это! Но для целей тестирования и разработки было бы неплохо найти решение проблемы с запуском Gradle. Кажется вероятным, что некоторые тесты не пройдут, если они не должны в результате этого.
ответить на ткрузе
вот build.gradle. DummyMain.groovy находится под src\main\groovy\core.
apply plugin: 'java-library'
apply plugin: 'groovy'
apply plugin: 'application'
mainClassName = "core.DummyMain"
repositories {
jcenter()
mavenCentral()
}
dependencies {
api 'org.apache.commons:commons-math3:3.6.1'
implementation 'com.google.guava:guava:21.0'
compile 'org.codehaus.groovy:groovy-all:2.6.0-alpha-2'
compile 'net.bytebuddy:byte-buddy:1.6.11'
compile 'org.jline:jline:3.7.0'
}
Ответчиком на единственный ответ (пока) является автор JLine. Я думаю, что очень маловероятно, что Gradle использует JLine, и что если бы это было так, Гийом Ноде упомянул бы это...
1 ответ
Я полагаю, вы заметили, что в одном случае вы имеете в виду jline-terminal-jna
в то время как в другом случае вы имеете в виду jline
, В то время как jline
банка содержит jline-terminal-jna
содержимое jar, зависимости немного отличаются, потому что библиотека JNA является обязательной зависимостью jline-terminal-jna
, но необязательная зависимость jline
,
Вы должны проверить класс Terminal
экземпляр, созданный JLine и убедитесь, что это ожидаемый JnaWinSysTerminal
учебный класс.
Это также может быть связано с проблемой JLine, поднятой некоторое время назад, https://github.com/jline/jline3/issues/77. Однако в JLine исправить нечего, и связанная с этим проблема gradle была отклонена и закрыта (см. https://github.com/gradle/gradle/issues/1099).