Groovy: JLine 不等待输入 Gradle

Groovy: JLine does not wait for input Gradle

OS:Windows10个,主要使用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.

,就会发生这种等待失败

从其他打印行我可以看出这里的 reader 在所有 3 种情况下都是 class NonBlockingInputStreamReader(即通过 Cygwin 的 Gradle,Gradle 通过 Windoze CMD 或 groovy 命令行命令)。

但是,我发现如果我执行 gradle installDist,生成的 "distributed" 版本应用程序工作正常:响应输入的每个字符并等待下一个。为此感谢上帝!但是出于测试和开发目的,如果可以找到解决尝试 运行 和 Gradle 的问题的方法,那就太好了。一些测试似乎很可能会因此而失败,而这些测试本不应该失败。

回复 tkruse

这是 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 的可能性很小,如果是这种情况,Guillaume Nodet 会提到......

我想您已经注意到,在一种情况下,您指的是 jline-terminal-jna,而在另一种情况下,您指的是 jline。虽然jline jar 包含jline-terminal-jna jar 内容,但依赖关系略有不同,因为JNA 库是jline-terminal-jna 的强制依赖项,但是jline 的可选依赖项。

您应该检查 JLine 创建的 Terminal 实例的 class 并验证这是预期的 JnaWinSysTerminal class.

它也可能与前一段时间提出的 JLine 问题有关,https://github.com/jline/jline3/issues/77。 然而,在 JLine 中没有什么可以修复的,相关的 gradle 问题被拒绝并关闭(参见 https://github.com/gradle/gradle/issues/1099)。