【问题标题】:How to know whether you are running inside a gradle daemon如何知道你是否在 gradle 守护进程中运行
【发布时间】:2014-06-09 12:30:15
【问题描述】:

我们有一种情况,我们在运行 gradle 的 VM 中占用了一个 Jetty 实例。

但是,当我们在 gradle 守护进程中运行时,这会非常失败:我们并没有完全摆脱 Jetty 实例,因此它必须随着 gradle 进程本身而死。 (不过,这并不是什么大问题,因为无论如何我们都不希望在这个 CI 集成测试案例中使用 gradle 守护进程)。

所以,我们想知道当前任务是否在 gradle 守护进程中运行 - 这样我们就可以抛出异常或以其他方式通知用户这是错误的方法,请运行这个非守护进程。

【问题讨论】:

  • 也许我不明白你在追求什么,但是Thread.currentThread().isDaemon() 不起作用吗?
  • Gradle 有这个“守护程序配置”,您发出的第一个 gradle-command 启动守护进程,随后的命令只与该进程对话。这样您就不会产生 JVM 和解析文件等的启动成本 - 您可以对发出的命令进行“即时反应”。然而,这个守护进程永远存在(或者直到你杀死它),并且由于 JVM 可能被加载的类等“污染”,所以应该可以从 Gradle 脚本中知道它是在守护进程中运行还是在不是。

标签: gradle gradle-daemon


【解决方案1】:

Gradle 将其线程之一命名为“守护线程”,因此如果您允许 hack,这可能会起作用:

def isDaemon = Thread.allStackTraces.keySet.any { it.name.contains "Daemon" };

【讨论】:

    【解决方案2】:

    另一种解决方案是读取“sun.java.command”属性。

    如果您在守护进程中,则 gradle 2.5 的值为

    org.gradle.launcher.daemon.bootstrap.GradleDaemon 2.5
    

    如果你不是,价值是

    org.gradle.launcher.GradleMain taskName
    

    很简单

    if (System.properties.'sun.java.command'.contains('launcher.daemon')) {
      println 'Daemon is true'
    } else {
      println 'Daemon is false'
    }
    

    也可以解决问题

    【讨论】:

      【解决方案3】:

      我想从 gradle 插件的上下文中了解这一点。在检查了 gradle 源之后,我最终找到了答案:

      val daemonScanInfo: DaemonScanInfo? = (project as DefaultProject).services.get(DaemonScanInfo::class.java)
      val runningAsDaemon = !daemonScanInfo.isSingleUse
      

      这样做的好处是能够检测--no-daemon 以及定义org.gradle.daemon=true|false。执行 project.findProperty("org.gradle.jvmargs") 并没有在命令行上捕获 --no-daemon。

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-02
        • 2017-11-25
        • 1970-01-01
        • 2018-11-08
        • 1970-01-01
        相关资源
        最近更新 更多