Java `System.console()`如果从'gradle run'执行,则返回'null'`

Java `System.console()`如果从'gradle run'执行,则返回'null'`,java,gradle,console,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'

我有一个简单的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
如果我通过
gradlejar从终端执行它;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
不是唯一的问题,而是最明显的问题。实际上,我想从由
gradle run
执行的程序中访问WinAPI
WriteConsoleW
函数,由于与
System.console()
null
相同的原因,我无法使用此函数。所以如果这个选项可用,我真的需要在Gradle中禁用输出重定向


另外请注意,该问题与其他问题不同,因为该问题询问如何在Gradle脚本中使用
System.console()
,而不是在由
Gradle run调用的Java程序中使用
;我相信它们在这方面的工作方式不同,因为这两个答案都不适用于我的情况。

为了使
java.io.Console
可用,子进程的stdin和stdou必须指向Linux/macOS/Unix终端或Windows控制台。最简单的安排方式是从已经以这种方式设置的父进程继承stdin和stdout。然而,Gradle()的一个已知限制是
JavaExec
任务类型不支持使子进程继承父进程的输入/输出流

如果Gradle
JavaExec
任务类型得到了增强,以支持stdin/stdout继承,那么这可以用于
Gradle--no daemon run


让它与Gradle守护进程一起工作要复杂得多,可能需要平台特定的代码来操作伪终端或调用Windows控制台API。

如何测试使用
console()
的程序?你不能发送它测试输入,也不能验证输出,那么你在测试什么?@Andreas首先我测试它是否工作,并且没有抛出任何异常。第二种选择是使用一些依赖于平台的API,比如win32
ReadConsoleOutput
,或者使用包装器,比如
winpty
。我正在为Windows控制台编写一个包装器库,所以可以使用依赖于平台的解决方案?你找到这个重复的问题了吗?没有,链接的答案对我不起作用。我特别提到我正在运行
gradle——没有守护进程运行,它仍然不工作。我有同样的问题。我在某个地方读到,包括
standardInput=System.in
in-run任务将使它工作,但它对我不起作用。无论如何,一些人报告说这对他们有效。