Предположим, у меня есть 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 прекратить связываться с терминалом и разрешить запуск приложения для доступа к нему?