IntelliJ IDEA关联gradle源码

5,552 阅读1分钟

IntelliJ IDEA关联gradle源码

  1. 创建一个gradle项目,包含gradle和groovy依赖

  1. 新建一个buildSrc的module——默认的自定义task和plugin在这个目录进行编译

  2. 在buildSrc的build.gradle中添加对gradle和groovy的api的依赖(否则依赖gradle的api时,编译会失败)

    dependencies {
        compile gradleApi()
        compile localGroovy()
    }
    
  3. 配置gradle:

    • 配置环境变量,默认在C:/用户/用户名/.gradle/wrapper/dists/,有多个版本,选择gradle-xxxx-all/xxx/gradle-xxx/bin添加到系统环境变量的path变量中

      (all是带源码)

      运行gradle wrapper --gradle-version 5.6.2 --distribution-type all

    • 或者配置gradle wrapper,gradle/wrapper/gradle-wrapper.properties 中的distributionUrl配置成带-all的版本

      运行gradlew.bat wrapper

  4. 以上完成后,运行gradle build,可以关联gradle源码,如:

    • 在build.gradle中点dependencies等可以跳转到对应的源码
    • 在buildSrc下新建groovy文件,在其中依赖gradle的api,如继承DefaultTask,可以查看它的源码
  5. 编译过程中gradle build如果报错:

    * What went wrong:
    Execution failed for task ':buildSrc:compileGroovy'.
    > java.lang.ExceptionInInitializerError (no error message)
    
    

    可以运行gradle build --stacktrace查看错误堆栈,如果是如下错误:

    Caused by: groovy.lang.GroovyRuntimeException: Conflicting module versions. Module [groovy-all is loaded in version 2.5.4 and you are trying to load version 2.3.7
            ... 24 more
    

    说明gradle依赖的版本和build.gradle中依赖的版本不一致

    可以查看gradle依赖的groovy的版本

然后将build.gradle中的groovy的版本改成跟它一样即可。

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.5.4'
    compile gradleApi()
    compile localGroovy()
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
  1. 如果没有其他问题,应该就可以依赖gradle的api,并且可查看源码

    package com.hero.test
    
    import org.gradle.api.DefaultTask
    import org.gradle.api.tasks.Input
    import org.gradle.api.tasks.InputFile
    import org.gradle.api.tasks.OutputFile
    import org.gradle.api.tasks.TaskAction
    import org.gradle.api.tasks.Optional
    
    class LogTask extends DefaultTask {
    
        @InputFile
        File inputFile
        @InputFile
        File xslStyleFile
        @Input
        @Optional
        Map<String, String> params = [:]
        @OutputFile
        File outputFile
    
        LogTask() {
            onlyIf {
                inputFile.exists()
            }
        }
    
        @TaskAction
        void start() {
            ant.xslt(in: inputFile, style: xslStyleFile, out: outputFile) {
                params.each { key, value ->
                    ant.param(name: key, expression: value)
                }
            }
        }
    }