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).

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