操作系统: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/