考虑一下,我有一个使用java.io.Console
API或其他任何操作终端的API的 Java (或 Kotlin 都没关系)应用程序状态(例如: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
仍然是{{1 }},而java.io.PipedInputStream
和System.out
是System.err
的实例。
是否可以使 Gradle 不再与终端混乱,并允许正在运行的应用程序访问它?
答案 0 :(得分:0)
您可能错误地分配了它们,因为这两个都应为ByteArrayOutputStream
。并且甚至可能甚至不应该在Gradle中分配它们(默认值的分配是多余的)。如果您不希望使用Exec
,请使用java -jar fileName
然后执行JavaExec
。