【问题标题】:How to debug Play 2 Application built with Gradle如何调试使用 Gradle 构建的 Play 2 应用程序
【发布时间】:2015-11-20 00:29:36
【问题描述】:

debugging Play 应用程序with IntelliJ IDEA 似乎有大量文档,但它们都假设 Play 是使用 SBT 构建的。

使用 Gradle 进行调试应该很简单:

  • 设置一些断点
  • 运行GRADLE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9999" gradlew --no-daemon :runPlayBinary
  • 运行如下所示的 IntelliJ 远程配置:

我遇到的问题是:断点永远不会被命中,处理继续正常进行。 技术:Play 2.3.X、IDEA 14.1、Gradle 2.8、Scala 2.10

我一定是错过了什么,那是什么?

【问题讨论】:

  • 出于好奇,我能问一下您为什么使用 gradle 而不是 sbt?
  • SBT 不能很好地与我们的其他 Gradle 项目“配合”,因为依赖管理和构建的其他方面有时会发生冲突。此外,我们的测试表明 Gradle 更快、更具确定性。我的回答实际上比这长得多,所以它并不适合作为评论。
  • 你解决了吗?我也有同样的问题。
  • 恐怕我还没解决这个问题。
  • @antonzy 这已经回答了。

标签: debugging intellij-idea gradle playframework


【解决方案1】:

您将调试参数设置在错误的位置。在GRADLE_OPTS 中设置它定义了运行 Gradle 时要使用的系统属性。因为 Gradle 会启动一个新的 JVM 进程来执行 Play Framework 应用程序,所以您必须将这些属性带到运行应用程序的 JVM。

您可以使用PlayRun 任务来添加JVM 参数。像这样的:

tasks.withType(PlayRun) {
    forkOptions.jvmArgs = ['-Xdebug', 
                          '-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9999']
}

但请注意,此设置将在您每次执行应用程序时设置调试模式。也许你应该添加一些参数来验证你是否想要调试模式。

之后,你就可以在你的IDE中正常设置远程调试了。

希望对你有帮助;)

【讨论】:

  • 太棒了,这行得通!请注意,对于阅读此答案的人,您必须在运行 ./gradlew runPlayBinary 后按照问题中的说明附加调试器进程
  • 对于大于 1.4 的 Java 版本,参数应该是 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999
【解决方案2】:

基于 joao 的回答,您可以创建一个新任务并使用您的远程配置连接到它:

task debugPlayBinary {
    doLast {
        def runPlayTask = tasks.findByName('runPlayBinary')
        runPlayTask.forkOptions.jvmArgs = ['-Xdebug', '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005']
        runPlayTask.run()
    }
}

这允许runPlayBinary 保持不变。

【讨论】:

  • 注意:'tasks.findByName('runPlay')' 现在是正确的语法
【解决方案3】:

Play 2.7、Java 8、Gradle 组合需要以下内容: 运行它:gradle runPlay -Ddebug=true

play {
    injectedRoutesGenerator = true
    platform {
        playVersion = playV
        scalaVersion = scalaV
        javaVersion = javaV
    }
    if (System.getProperty("debug")) {
        def runPlayTask = tasks.findByName('runPlay')
        runPlayTask.forkOptions.jvmArgs = ['-Xdebug', '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005']
    }
}```

【讨论】:

  • 注意:“suspend=y”表示等待debug端口连接上后再继续。
猜你喜欢
  • 2017-01-22
  • 2012-07-05
  • 2015-10-02
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2014-07-09
  • 2022-06-20
相关资源
最近更新 更多