java - Groovy:JLine不等待输入Gradle

标签 java gradle groovy system.in jline3

操作系统: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类(即通过Cygwin进行Gradle,通过Windoze CMD进行Gradle或groovy命令行命令)。

但是,我发现如果执行gradle installDist,则该应用程序的结果“分布式”版本可以正常运行:响应输入的每个字符并等待下一个字符。为此感谢上帝!但是出于测试和开发目的,如果可以找到尝试与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实例的类,并验证这是预期的JnaWinSysTerminal类。

它也可能与前一阵子的JLine问题https://github.com/jline/jline3/issues/77有关。
但是,JLine没有什么要修复的,相关的gradle问题被拒绝并关闭(请参阅https://github.com/gradle/gradle/issues/1099)。

关于java - Groovy:JLine不等待输入Gradle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49864080/

相关文章:

java - 如何在Spring WebFlux中设置ViewResolver

java - 处理 lambda 中的检查异常

android - 如何解决这个android gradle问题?

java - VS Code 是否有针对 Apache Groovy 的语言扩展?

java - 如何使用jython jar将python模块添加到java中

java - 如何在 WAR 项目中从 JNDI 正确引用带注释的 EJB3 bean

gradle - 下载android studio使用的依赖源码

java - Spring 工具套件4 : not possible to open projects after the update to version 4. 5.0

groovy - 如何定义一个接受参数化闭包作为参数的 Groovy 函数?

git - Gradle:将变量从一个任务传递到另一个任务