无法让 Gradle 使用 System.in

mik*_*ent 1 inputstream system.in blocking gradle

这个问题解释了如何System.in在运行任务时使用来运行项目中的特定类。

但对我来说,目前它不起作用:尽管我已将application插件和以下几行包含在build.gradle

mainClassName = "misc.StreamsExp"
run{ 
    standardInput = System.in 
}
task stream( type: JavaExec, dependsOn: assemble ){
    classpath sourceSets.main.runtimeClasspath
    main = "misc.StreamsExp"
}
Run Code Online (Sandbox Code Playgroud)

下面的应用程序代码中的行readLine应该是阻塞的,但事实并非如此:

BufferedReader br = new BufferedReader(new InputStreamReader( System.in ));

String enteredLine = "";
while( enteredLine == null || ! enteredLine.equals( "q" )){
    System.out.println( "spuds");
    enteredLine = br.readLine();
}
Run Code Online (Sandbox Code Playgroud)

...相反,事情会永远旋转:

土豆土豆
土豆
土豆
...

注意,我使用的是 Windows 10 操作系统,带有 Java 8.91。我尝试过 Windows DOS 控制台和 Cygwin。
NB2 当我在 Eclipse(Gradle STS Eclipse 插件)内运行此任务时,会发生同样的事情stream......但当我这样做时不会发生Run as --> Java application:然后阻塞会按预期发生。

mik*_*ent 5

哈...其中一个你认为你会永远被难住的地方,你在发布到 SO 后 2 分钟就找到了解决方案!我会把它留在这里给其他人...

答案是将行放入standardInput =您正在运行的任务中,如下所示:

task stream( type: JavaExec, dependsOn: assemble ){
    standardInput = System.in
    classpath sourceSets.main.runtimeClasspath
    main = "misc.StreamsExp"
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,在 Windows DOS 终端中,提示符“spuds”后面跟着的是

> 建筑 88% > :stream

...这是我提到的问题中提到的一个已知的“错误”。在 Cygwin 中,这个错误不会发生。

注意:这适用于 Windows DOS 终端和 Cygwin 终端...它不能解决streamEclipse 中运行定制任务时的问题!