Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Groovy:JLine不等待输入Gradle_Java_Gradle_Groovy_System.in_Jline3 - Fatal编程技术网

Java Groovy:JLine不等待输入Gradle

Java Groovy:JLine不等待输入Gradle,java,gradle,groovy,system.in,jline3,Java,Gradle,Groovy,System.in,Jline3,操作系统: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.TerminalBuil

操作系统: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
,则会发生等待失败

从另一个打印行中,我可以看出这里的读卡器在所有3种情况下都是class
NonBlockingInputStreamReader
(即Gradle通过Cygwin、Gradle通过Windoze CMD或
groovy
命令行)

然而,我发现如果我执行
gradle installDist
,则生成的“分布式”版本的应用程序工作正常:响应输入的每个字符并等待下一个字符。感谢上帝!但是出于测试和开发的目的,如果能够找到一个解决方案来解决尝试使用Gradle运行的问题,那就太好了。因此,有些测试可能会在不应该失败的情况下失败

回复tkruse

这是我们的设计,格雷德尔。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终端jna
,而在另一种情况下,您指的是
jline
。虽然
jline
jar包含
jline-terminal-jna
jar内容,但依赖项略有不同,因为jna库是
jline-terminal-jna
的强制依赖项,但是
jline
的可选依赖项

您应该检查由JLine创建的
终端
实例的类,并验证这是预期的
JnaWinSysTerminal

这也可能与前一段时间提出的JLine问题有关。
但是,在JLine中没有需要修复的内容,相关的gradle问题已被拒绝并关闭(请参阅)。

谢谢。。。事实上,“jline terminal jna”/“jline”问题并不重要,只是我在试验这两种方法。。。现在已更正以消除混淆。你的另一个观点是:我用Groovy脚本得到了
posixysterminal
,用
installDist
发行版得到了这个类(也就是那些可以工作的),但是。。。哦,亲爱的,
DumbTerminal
带有
gradle run
gradle build
,等等。这是你的最后一段:这有点超出了我的工资等级(尤其是
ProcessBuilder
的东西)。。。但就我的调查而言,maven
exec
plugin(1.6.0)的最新版本2017-03似乎确实使用了Java 7。因此,接下来的问题是Gradle的
应用程序的最新版本是否使用了这个1.6.0,或者我是否可以将这个Gradle插件配置为使用下载的1.6.0版本。已在Gradle论坛上发布。。。我想你不用Gradle!这不仅仅是关于能够使用Java7,还有一些必要的代码更改。我在maven exec插件和graddle上提出了2个PRs,但没有一个通过。欢迎再次与两支球队进行平局,我愿意从我这边提供帮助。好的,谢谢。J'ai“pingué”Gradle论坛。。。无应答再唱。这将有助于展示你建筑的一部分,以便其他人可以复制。Gradle本身可能依赖于特定版本的jline,因此在类路径上可能会有两个版本的jline