【发布时间】:2016-09-18 04:29:48
【问题描述】:
我有这个简单的 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
我知道当父进程使用标准输出重定向时,System.console() 可能会返回null。是否有一些 Gradle 选项可以禁用重定向并使控制台对我的程序完全可用?
我正在为 Java 开发一个终端库,因此我想在没有 Gradle 干预 stdin/stdout/stderr 的情况下运行我的测试和可执行文件。
请注意System.console() 是null 不是唯一的问题,而是最明显的问题。实际上,我想从gradle run 执行的程序中访问WinAPI WriteConsoleW 函数,由于System.console() 是null 的相同原因,我无法使用此函数。因此,如果此选项可用,我真的需要在 Gradle 中禁用输出重定向。
另外请注意,该问题与Gradle build null console object 不同,因为该问题询问如何在Gradle 脚本中使用System.console(),而不是在gradle run 调用的Java 程序中;我相信他们在这件事上的工作方式不同,因为这两个答案都不起作用或不适用于我的情况。
【问题讨论】:
-
你如何测试一个使用
console()的程序?你不能给它发送测试输入,你也不能验证输出,那你在测试什么? -
@Andreas 首先我测试它是否正常工作并且没有抛出任何异常。第二种选择是使用一些依赖于平台的 API,如 win32
ReadConsoleOutput或包装器,如winpty。我正在为 Windows 控制台编写一个包装库,所以使用平台相关的解决方案是可以的。 -
那么当您进行网络搜索时,您发现了什么?你找到这个重复的问题了吗?
-
不,链接的答案对我不起作用。我特别提到我正在运行
gradle --no-daemon run,它仍然不起作用。 -
我也有同样的问题。我在某处读到,在运行任务中包含
standardInput = System.in会使其工作,但它对我不起作用。无论如何,有些人报告说这对他们有用。