【问题标题】:Debug Gradle plugins with IntelliJ使用 IntelliJ 调试 Gradle 插件
【发布时间】:2012-06-20 23:01:34
【问题描述】:

问题

我想将交互式调试器与 IntelliJ 一起使用。 很遗憾,我无法说服 IntelliJ 加载和编译插件。但是,我可以做gradle clean build,插件会按预期构建和运行它的测试。

具体来说,我正在尝试调试对 gradle-js-plugin 的本地更改 ,而 IntelliJ 说它找不到 com.google.javascript.jscomp.CompilerOptionsspock.lang.Specification。 (我在想这可能与它们的加载方式有关,但这是一个猜测。)


我尝试过的事情

注意:我没有在步骤之间恢复任何流程。

0。我的第一个猜测

我在docs.codehaus.org 上注意到a howto。 IntelliJ 找不到 org.gradle.launcher.GradleMain,因此我对其进行了调整以使用 GradleLauncher 和以下内容:

import org.gradle.GradleLauncher

class GradleScriptRunner {
    public static void main(String[] args) {
        GradleLauncher.newInstance(
            "-p", 
            "/path/to/gradle-js-plugin/src/test/resources/build.gradle", 
            "clean assemble"
        )
    }
}

每个GradleLauncher's documentation

结果: IntelliJ 不会编译项目。


1。每Peter Niederwieser's answer通过插件修复idea项目和调试

步骤

  1. ~# cd /path/to/gradle-js-plugin && gradle cleanIdea idea
  2. 打开新创建的项目并尝试使用第 0 步中的 ScriptRunner 进行调试。

结果:项目编译(耶!),但我只能在GradleScriptRunner.groovy 中打断点。


2。根据 Peter Niederwieser's answer 运行带有特殊选项的 gradle CLI

1 & 2. 为清晰起见合并:

~# export GRADLE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"
~# gradle clean assemble
Listening for transport dt_socket at address: 5005
  1. 配置 IntelliJ 以连接到此端口并开始调试(见图):

对于这一步,我尝试了以下 .gradle 文件配置:

1.仅使用 build.gradle

--build.gradle--

apply plugin: 'groovy'
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'maven'
apply plugin: 'js'

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }

    dependencies {
        compile findProject "/path/to/gradle-js-plugin"
    }
}

repositories {
    mavenLocal()
    mavenCentral()
}

结果:

FAILURE: Build failed with an exception.

* Where:
Build file '/path/to/gradle-js-plugin/src/test/resources/build.gradle' line: 13

* What went wrong:
A problem occurred evaluating root project 'resources'.
> No such property: findProject for class: org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 8 mins 50.498 secs

2.同时使用 build.gradle 和 settings.gradle

--settings.gradle--

include "/path/to/gradle-js-plugin"

--build.gradle--

apply plugin: 'groovy'
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'maven'
apply plugin: 'js'

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }
}

repositories {
    mavenLocal()
    mavenCentral()
}

结果:

FAILURE: Build failed with an exception.

* Where:
Build file '/path/to/gradle-js-plugin/src/test/resources/build.gradle' line: 5

* What went wrong:
A problem occurred evaluating root project 'resources'.
> Plugin with id 'js' not found.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 13.553 secs


我的设置

分级

~# gradle -v
------------------------------------------------------------
Gradle 1.0
------------------------------------------------------------

Gradle build time: Tuesday, June 12, 2012 12:56:21 AM UTC
Groovy: 1.8.6
Ant: Apache Ant(TM) version 1.8.2 compiled on December 20 2010
Ivy: 2.2.0
JVM: 1.7.0_04 (Oracle Corporation 23.0-b21)
OS: Linux 3.2.0-2-amd64 amd64

Java

~# java -version
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)

IntelliJ

IntelliJ IDEA Ultimate 117.499 w/ Bundled Gradle plugin

希望

任何能让我在插件中进入调试模式的提示。

【问题讨论】:

  • FWIW,我可以使用 Peter 的技术逐步完成插件代码。如果您对此有任何问题,请告诉我。

标签: debugging intellij-idea gradle


【解决方案1】:

我能够使用 -Dorg.gradle.debug=true(找到 on gradle forum)调试 gradle 源(包括插件):

  1. 如果有的话,停止守护进程:

    ./gradlew --stop

  2. 运行

    ./gradlew <task> --no-daemon -Dorg.gradle.debug=true

  3. 远程连接到 gradle 进程(端口 5005) - 如果使用 IntelliJ IDEA,请参见上面的 OP 图像

它现在应该在断点处停止。


顺便说一句,我为 gradle 源创建了一个单独的 IntelliJ IDEA 项目。由于我使用 gradle 包装器,因此我已经从

~/.gradle/wrapper/dists/gradle-1.11-all/7qd8qq8te5j4f5q9aaei3gh3lj/gradle-1.11/src

在 IDEA 中我做了File->Import Project,然后选择了上面的路径,然后 - “从现有源创建项目”。点击 Next 几次(确保我没有包含来自lib/plugins 目录的任何 jar,因为 IDEA 会抱怨大多数项目文件已经存在)。

然后我在那个 IDEA 项目中创建了一个远程调试配置,并将其用于调试 gradle。

【讨论】:

  • 由于某种原因,这可以调试插件,而根据接受的答案使用 GRADLE_OPTS 则不行。谢谢。
【解决方案2】:

首先,您的 IDEA Gradle 项目似乎有问题。如果你运行 gradlew cleanIdea idea 然后从 IDEA 打开生成的项目(而不是使用 JetGradle 插件),一切都应该没问题。

其次,如果您仍然无法让 GradleMain/GradleLauncher(以前的类确实存在)方法工作,另一种方法是将 Gradle 构建作为外部应用程序进行调试。为此,您需要将-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 添加到GRADLE_OPTS 环境变量中,从命令行运行构建,等到它挂起,然后从IDEA 启动“远程”运行配置(具有相应的设置)。此时,调试器应连接到 Gradle 进程,您应该已启动并运行。

【讨论】:

  • +1 IntelliJ 现在可以识别类,但还没有在插件内部遇到断点。我将尝试外部方法。需要明确的是,我确实在 main 内部打断点,但在通过调试工具运行 main 时,我没有在插件内部打断点。如果我在插件中遇到断点,我将标记为答案。谢谢。
  • 我似乎无法在插件中安装调试器。我现在正在更新问题。
  • 好像你忘了在构建脚本部分声明“js”插件。如果调试器没有在断点处停止,则您在构建中使用的“js”插件和 Gradle 的版本可能与您在 IDE 中配置的版本不匹配。确保它们相同。
  • 我认为compile findProject "/path/to/gradle-js-plugin" 会在运行时创建一个插件实例。这是不正确的吗?如果没有,您能否指出我应该如何包含插件以使用本地版本。
  • 请注意确切地确定您要实现的目标,但是您不能在声明它的同一构建中应用插件。此外,在最后一个 build.gradle 中,您没有 @ 987654326@ 部分。
【解决方案3】:

IntelliJ IDEA 12.1 提供开箱即用调试 gradle 任务的能力 - 在 JetGradle 工具窗口任务列表中右键单击目标任务并选择“调试”

【讨论】:

  • 是的,这太棒了。 (当我开始使用 Gradle 时,情况并非如此。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2013-05-13
  • 2017-06-10
  • 2014-03-27
  • 2018-10-14
  • 2015-02-20
相关资源
最近更新 更多