Запуск приложения, которое использует API java.io.Console из Gradle - PullRequest
0 голосов
/ 19 июня 2019

Предположим, у меня есть 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 , но с 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

Настройка задачи run, как описано здесь и здесь :

private val run: JavaExec by tasks
run.apply {
    standardInput = System.`in`
    standardOutput = System.out
    errorOutput = System.err
}

или добавление --no-daemon к Аргументам командной строки , как это предлагается здесь не очень помогает (System.in все еще является экземпляром java.io.PipedInputStream, тогда как System.out и System.err являются экземплярами org.gradle.internal.io.LinePerThreadBufferingOutputStream).

Можно ли заставить Gradle прекратить связываться с терминалом и разрешить запуск приложения для доступа к нему?

...