gpt4 book ai didi

java - `System.console()` 如果从 `null` 开始执行则返回 `gradle run`

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:55:28 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于java - `System.console()` 如果从 `null` 开始执行则返回 `gradle run`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39554114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com