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

时间:2019-06-19 11:45:02

标签: java gradle terminal tui

考虑一下,我有一个使用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

按照herehere所述配置run任务:

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.PipedInputStreamSystem.outSystem.err的实例。

是否可以使 Gradle 不再与终端混乱,并允许正在运行的应用程序访问它?

1 个答案:

答案 0 :(得分:0)

您可能错误地分配了它们,因为这两个都应为ByteArrayOutputStream。并且甚至可能甚至不应该在Gradle中分配它们(默认值的分配是多余的)。如果您不希望使用Exec,请使用java -jar fileName然后执行JavaExec