我有这个简单的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程序中;我相信他们在这方面的工作方式不同,因为这两个答案都不适用于我的案例。
答案 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。