【发布时间】:2019-11-02 03:35:36
【问题描述】:
假设我有一个 Java(或 Kotlin,并不重要)应用程序,它使用 java.io.Console API 或任何其他操纵终端状态的 API(例如:net.rubygrapefruit:native-platform):
System.out.println(format("Console is %s.", System.console()));
final Terminals terminals = Native.get(Terminals.class);
final Output out = Stdout;
if (terminals.isTerminal(out)) {
final TerminalOutput stdout = terminals.getTerminal(out);
stdout.bold();
System.out.println("bold text");
stdout.foreground(Color.Magenta);
System.out.println("Magenta");
stdout.reset();
final Prompter prompter = new Prompter(terminals);
prompter.askYesNo("Prompt", true);
prompter.enterText("Text", "default text");
prompter.enterPassword("Password");
prompter.select("Select", asList("foo", "bar", "baz"), 1);
} else {
System.out.println(format("%s is not a terminal.", out));
}
上面的代码在Maven Exec plug-in 启动时会运行得很好,但是使用 Gradle(因为 Gradle 试图产生 它自己的 输出看起来很漂亮,有所有那些花里胡哨和进度条)代码只是打印:
$ gradle --console=plain run
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :run
Console is null.
Stdout is not a terminal.
BUILD SUCCESSFUL in 0s
2 actionable tasks: 1 executed, 1 up-to-date
private val run: JavaExec by tasks
run.apply {
standardInput = System.`in`
standardOutput = System.out
errorOutput = System.err
}
或按照here 的建议将--no-daemon 添加到Gradle 的命令行参数并没有真正帮助(System.in 仍然是java.io.PipedInputStream 的一个实例,而System.out 和System.err 是 org.gradle.internal.io.LinePerThreadBufferingOutputStream 的实例。
是否可以让Gradle停止对终端的干扰并允许正在运行的应用程序访问它?
【问题讨论】: