如何调试使用Gradle

时间:2015-11-20 00:29:37

标签: debugging intellij-idea gradle playframework

似乎有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远程配置:

IntelliJ Remote Configuration

我遇到的问题是:断点从未被击中,处理继续正常进行。 技术:播放2.3.X,IDEA 14.1,Gradle 2.8,Scala 2.10

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

3 个答案:

答案 0 :(得分:5)

您将调试参数设置在错误的位置。在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中设置远程调试。

希望它有所帮助;)

答案 1 :(得分:1)

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']
    }
}```

答案 2 :(得分:0)

根据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保持不变。