【问题标题】:Running an application which uses java.io.Console API from Gradle运行使用来自 Gradle 的 java.io.Console API 的应用程序
【发布时间】:2019-11-02 03:35:36
【问题描述】:

假设我有一个 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 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 仍然是java.io.PipedInputStream 的一个实例,而System.outSystem.errorg.gradle.internal.io.LinePerThreadBufferingOutputStream 的实例。

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

【问题讨论】:

    标签: java gradle terminal tui


    【解决方案1】:

    您可能错误地分配了它们,因为它们都应该是ByteArrayOutputStream。并且可能它们甚至不应该在 Gradle 中分配(默认值的分配是多余的)。使用Exec,然后执行java -jar fileName,如果你不应该让它与JavaExec一起工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多