当前位置: 首页 > 知识库问答 >
问题:

Gradle console()为null,禁用了守护进程

胥宏义
2023-03-14

我正在使用Gradle 2.13和Java1.8。0_121。

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

def user=System。控制台()。readLine('请输入新用户用户名:')

然而,我得到了以下错误:<代码>

所以控制台()必须为空...好吧。我发现了这个相关的问题,建议禁用守护程序。

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

那么,如果Gradle守护进程没有引起这个问题,还会是什么?有没有更有经验的人知道?


共有1个答案

云远
2023-03-14
匿名用户

Gradle说它需要在子进程中运行构建,因为您的构建设置中存在某些内容:

为了尊重此构建的JVM设置,将分叉一个新的JVM。

我猜Gradle创建该子流程的方式允许它获取输出(这是Java提供的用于生成子流程的API的默认设置)。因此,子进程无法访问终端的输入/输出和系统。console()在该进程中为null:它未连接到系统控制台。

这让我好奇,所以我提出了一个脚本来演示这个问题(使用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中进行构建,而不需要分叉。不是Gradle专家,所以我不知道怎么做,但信息似乎暗示这是可能的

 类似资料:
  • 如何确定我的 Gradle 守护进程死亡的原因?我收到的唯一消息是L 这发生在活动版本中。几个步骤将完成,一个步骤将显示为活动状态,然后生成失败。 这是在将我们的内存参数(< code > Xmx < code > Xms < code > perm gen )从一个调用< code>gradlew的shell脚本移动到< code>gradle.properties并直接调用< code>gra

  • 本文向大家介绍python实现守护进程、守护线程、守护非守护并行,包括了python实现守护进程、守护线程、守护非守护并行的使用技巧和注意事项,需要的朋友参考一下 守护进程 1、守护子进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allow

  • 守护(Daemon)进程 我们可以认为守护进程就是后台服务进程,因为它会有一个很长的生命周期提供服务,关闭终端不会影响服务,也就是说可以忽略某些信号。 实现守护进程 首先要保证进程在后台运行,可以在启动程序后面加&,当然更原始的方法是进程自己fork然后结束父进程。 if (pid=fork()) { exit(0); // Parent process } 然后是与终端、进程组、会话(Ses

  • Daemonset可以确保全部(或者某些)节点上运行一个Pod的副本。 Daemonset可以确保全部(或者某些)节点上运行一个Pod的副本。当有节点加入集群时,也会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。 Daemonset典型用法如下: 在每个节点上运行集群存守护进程 在每个节点上运行日志收集守护进程 在每个节点上运行

  • 建议使用 systemd 管理我们的服务进程。 可以参考swoole官方文档 使用方法 请确保cabal.php配置文件中的swoole.daemonize配置为关闭状态(0或false)! 'swoole' => [ // ... 'daemonize' => 0, // ... ], 在 /etc/systemd/system/目录中,创建一个 cabal.

  • 命令模式 守护进程方式启动:bin/imi server/start -d 重定向标准输入输出:bin/imi server/start -d 文件名.log 此方法只可让服务在后台运行,退出 ssh 后不被终止。 无法在服务崩溃后重新拉起,建议使用 systemd Systemd Systemd 一般都已经集成在了现代 Linux 发行版中,使用它可以实现开机自启动和守护进程等功能。 但 Sys