如果从`gradle run`

时间:2016-09-18 04:29:48

标签: java gradle console

我有这个简单的Java程序:

package me.fornever.javaterminal;
public class Main {
    public static void main(String[] args) {
        System.out.println("Console: " + System.console());
    }
}

这个简单的build.gradle

apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'me.fornever.javaterminal.Main'

当我使用gradle --no-daemon run执行它时,我得到以下输出:

Console: null

如果我通过gradle jar; java -cp '.\build\libs\java-terminal.jar' me.fornever.javaterminal.Main从终端执行,我会得到以下内容:

Console: java.io.Console@3d4eac69

我知道当父进程使用stdout重定向时System.console()可能会返回null。是否有一些Gradle选项可以禁用重定向并使控制台完全可用于我的程序?

我正在开发一个Java终端库,所以我想在stdin / stdout / stderr中运行我的测试和可执行文件,而不需要Gradle干预。

请注意,System.console() null不是唯一的问题,而是最明显的问题。实际上我想从WriteConsoleW执行的程序中访问WinAPI gradle run函数,由于System.console() null System.console()的相同原因,我无法使用此功能}。因此,如果此选项可用,我确实需要在Gradle中禁用输出重定向。

另请注意,该问题与Gradle build null console object不同,因为该问题询问如何在Gradle脚本中使用gradle run而不是在buttons = document.querySelectorAll(".button"); i = 0, length = buttons.length; for (i; i < length; i++) { if (document.addEventListener) { buttons[i].addEventListener("click", function() { handleOnClick(this.id); }); } }; function handleOnClick(button_id) { switch(button_id) { case "button1" : document.getElementById("box").style.height = "250px"; break; case "button2" : document.getElementById("box").style.height = "100px"; break; default: //whatever not needed break; } }调用的Java程序中;我相信他们在这方面的工作方式不同,因为这两个答案都不适用于我的案例。

1 个答案:

答案 0 :(得分:1)

为了使java.io.Console可用,子进程'stdin和stdout必须指向Linux / macOS / Unix终端或Windows控制台。最简单的安排方法是从已经设置的父进程继承stdin和stdout。但是,Gradle(GRADLE-3292)存在已知的限制,JavaExec任务类型不支持使子进程继承父进程的输入/输出流。

如果Gradle JavaExec任务类型已增强,以支持stdin / stdout继承,则可以使其适用于gradle --no-daemon run

使用Gradle守护程序会更加复杂,并且可能涉及特定于平台的代码来操作伪终端或调用Windows控制台API。