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