gpt4 book ai didi

java - Gradle console() 为空,守护进程被禁用

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:50:36 24 4
gpt4 key购买 nike

我使用的是 Gradle 2.13 和 Java 1.8.0_121。

我们的 Gradle 任务之一依赖于用户输入。

def user = System.console().readLine('请输入新用户用户名:')

但是我收到以下错误:> Cannot invoke method readLine() on null object

所以 console() 必须为空...好吧。我找到了 this related issue suggesting to disable the daemon.

我这样做并使用 ./gradlew configureTask --no-daemon 运行它但得到了相同的结果......同样的错误。我很确定它没有使用守护程序,因为我收到以下消息:为了遵守此构建的 JVM 设置,将 fork 一个新的 JVM。请考虑使用守护进程:https://docs.gradle.org/2.13/userguide/gradle_daemon.html。

因此,如果 Gradle 守护程序不是导致此问题的原因,还有什么可能?有没有对 Gradle 更有经验的人知道?

最佳答案

Gradle 说它需要在子进程中运行构建,因为你的build设置中有一些东西:

To honour the JVM settings for this build a new JVM will be forked.

而且我猜 Gradle 创建该子进程的方式允许它获取输出(这是 Java 提供的用于生成子进程的 API 的默认设置)。因此,子进程无法访问终端的 I/O,并且 System.console() 在该进程中为空:它附加到系统控制台。

这让我很好奇,所以我想出了一个脚本来演示这个问题(使用 Groovy 简洁,它与这里的 Java 相同):

import java.io.Console

println "Console for main JVM: " + System.console()

Process p1 = new ProcessBuilder("groovy", "-e", "print System.console()")
.redirectErrorStream(true)
.start()
p1.waitFor()
println "Console for child JVM: " + p1.text

Process p2 = new ProcessBuilder("groovy", "-e", "println 'Console for child JVM with inherited IO: ' + System.console()")
.redirectErrorStream(true)
.inheritIO() // <- this changes everything, as now p2 is attached to system console
.start()
p2.waitFor()
// No need to (actually cannot) get output of p2, as I/O is inherited by p2 it gets printed to terminal directly

结果:

Console for main JVM: java.io.Console@64cd705f
Console for child JVM: null
Console for child JVM with inherited IO: java.io.Console@3c130745

所以 Gradle 可能正在构建像我示例中的 p1 这样的子进程。我想它需要这样做,因为它需要检查输出(而不是让它直接进入系统输出)。

我认为您唯一的解决方案是:

  • 找到一种方法让 Gradle 在主 JVM 中进行构建,而无需 fork 。我不是 Gradle 专家,所以我不知道怎么做,但消息似乎暗示这是可能的。
  • 找到另一种获取用户输入的方法。也许是一个 Swing 对话框? (不是很优雅,但是嘿,一个接受用户输入的构建首先不是很优雅,所以收集方式在这一点上并不重要)

关于java - Gradle console() 为空,守护进程被禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43687552/

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