运行使用Gradle的java.io.Console API的应用程序

运行使用Gradle的java.io.Console API的应用程序,java,gradle,terminal,tui,Java,Gradle,Terminal,Tui,假设我有一个Java(或Kotlin,其实并不重要)应用程序,它使用Java.io.ConsoleAPI,或任何其他操作终端状态的API(例如:): 上面的代码在由启动时运行正常,但使用Gradle(因为Gradle试图使自己的输出看起来漂亮,带有所有的铃声、口哨和进度条),代码只打印: $gradle--console=普通运行 >任务:将ejava编译为最新版本 >任务:processResources无源 >任务:更新课程 >任务:运行 控制台为空。 Stdout不是终端。 在0秒内成功构

假设我有一个Java(或Kotlin,其实并不重要)应用程序,它使用
Java.io.Console
API,或任何其他操作终端状态的API(例如:):

上面的代码在由启动时运行正常,但使用Gradle(因为Gradle试图使自己的输出看起来漂亮,带有所有的铃声、口哨和进度条),代码只打印:

$gradle--console=普通运行
>任务:将ejava编译为最新版本
>任务:processResources无源
>任务:更新课程
>任务:运行
控制台为空。
Stdout不是终端。
在0秒内成功构建
2项可执行任务:1项已执行,1项最新
按说明配置
运行
任务,并:

private val run:JavaExec by tasks
运行{
标准输入=系统。`in`
标准输出=系统输出
errorOutput=System.err
}
或者按照建议将
--no daemon
添加到Gradle的命令行参数中并没有真正的帮助(
System.in
仍然是
java.io.PipedInputStream
的实例,而
System.out
System.err
org.Gradle.internal.io.LinePerThreadBufferingOutputStream
的实例)


是否可以让Gradle停止干扰终端并允许正在运行的应用程序访问它?

您可能错误地分配了它们,因为它们都应该是由TearrayOutputStream
指定的。也许它们甚至不应该在Gradle中赋值(默认值的赋值是多余的)。使用
Exec
,然后执行
java-jarfilename
,如果您不应该让它使用
JavaExec

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));
}