zhaoyu@home:~$

gradle-插件

gradle的核心提供了很少的实现。大部分功能都通过插件来实现。插件加入了新的task(如JavaCompile),对象(如SourceSet), 习惯(java源码路径为src/java/main),及对gradle核心对象的扩展。

###插件的类型 有两种类型的插件:二进制插件脚本插件

二进制插件

二进制插件要么通过实现插件接口编程实现,要么使用gradle的DSL语言编写。二进制插件可以出现在buildScript,项目层级中或外部插件的jar中。

脚本插件

脚本插件通常是其他的构建脚本,通常在构建中使用。

使用插件

使用插件通常有两步,第一,需要解析插件。第二,将插件应用到目标,通常是一个项目。

解析插件通常包括找到jar的正确版本,并将它添加到脚本的classpath中。插件解析完成后,在build脚本文件中就可以使用插件的API了。 脚本插件可以自动完成解析。Gradle的包含的核心二进制插件也是自动解析的。

应用一个插件通过执行apply(T),应用插件是幂等的,多次应用插件不会产生副作用。

通常解析和应用应该在一起完成。推荐通过plugins DSL 一次完成解析和应用。

二进制插件

使用插件DSL应用插件

插件DSL 提供了一种简洁方便的方式声明插件依赖。和 Gradle plugin portal 一起提供了核心插件和社区插件。

声明核心插件如下:

plugins {
    id 'java'
}

声明社区插件如下:

plugins {
    id 'com.jfrog.bintray' version '0.4.1'
}

然而DSL 的plugins{}和传统的apply()有几点很大的不同。

  1. plugins{}不能包含任何的代码。
  2. plugins {} 只能用在项目的build script和settings.gradle文件中,不能用在脚本插件或init scripts中。
  3. 在多项目结构中,plugins{} 是立即解析和应用的,所以可以通过apply false告诉gradle不立即应用插件。然后 在子项目中通过apply 或者plugins{}应用。 根项目如下: ```groovy plugins { id ‘com.example.hello’ version ‘1.0.0’ apply false id ‘com.example.goodbye’ version ‘1.0.0’ apply false }

subprojects { if (name.startsWith(‘hello’)) { apply plugin: ‘com.example.hello’ } }

子项目如下:
```groovy
plugins {
    id 'com.example.goodbye'
}

从buildSrc目录中应用插件

可以在项目的buildSrc目录中定义一个插件。然后在build脚本中应用。 buildSrc/build.gradle代码如下:

plugins {
    id 'java-gradle-plugin'
}

gradlePlugin {
    plugins {
        myPlugins {
            id = 'my-plugin'
            implementationClass = 'my.MyPlugin'
        }
    }
}

build.gradle

plugins {
    id 'my-plugin'
}

从buildscript块应用插件

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:0.4.1'
    }
}

apply plugin: 'com.jfrog.bintray'

脚本插件

apply from: 'other.gradle'

脚本插件是自动解析的,并从其他路径的脚本中应用。

插件管理

插件管理标签块pluginManagement {}只出现在settings.gradle文件中,而且必须是文件中的第一个块,或者在initscript 中。 settings.gradle

pluginManagement {
    plugins {
    }
    resolutionStrategy {
    }
    repositories {
    }
}

发布插件

如下使用插件 java-gradle-plugin 发布com.example.hello插件和com.example.goodbye插件,发布到maven和ivy。

plugins {
    id 'java-gradle-plugin'
    id 'maven-publish'
    id 'ivy-publish'
}

group 'com.example'
version '1.0.0'

gradlePlugin {
    plugins {
        hello {
            id = 'com.example.hello'
            implementationClass = 'com.example.hello.HelloPlugin'
        }
        goodbye {
            id = 'com.example.goodbye'
            implementationClass = 'com.example.goodbye.GoodbyePlugin'
        }
    }
}

publishing {
    repositories {
        maven {
            url '../../consuming/maven-repo'
        }
        ivy {
            url '../../consuming/ivy-repo'
        }
    }
}

java

java插件将Java编译以及测试和捆绑功能添加到项目中。是其他很多jvm语言gradle插件的基础。在build.gradle中引用如下:

plugins {
    id 'java'
}

任务

java插件定义了很多任务,常用的有如下:

  • compileJava 使用jdk编译源码
  • compileTestJava 编译测试源码
  • jar 组装jar文件。
  • test 执行Junit或者TestNG测试等。
  • 其他相关任务,略,可参考官方文档。

还有资源集合相关的任务:

  • compileSourceSetJava 使用jdk编译资源集合的java源代码。
  • processSourceSetResources 复制资源的源码到指定的资源路径
  • sourceSetClasses 继承自compileSourceSetJava 和 processSourceSetResources,编译资源集合并打包执行。

生命周期相关任务:

  • assemble 继承自jar任务,组装集成所有压缩包。
  • check 继承自test任务,运行测试并验证。
  • build 继承check,assemble任务,执行整个项目的构建。
  • 其他相关任务,略,可参考官方文档。

依赖配置

java插件添加了一系列依赖配置。

  • implementation 继承自compile,编译时依赖。
  • compileOnly 只在编译时使用,不会再运行时使用。
  • compileClasspath 继承自compile, compileOnly, implementation。编译路径,编译源码时使用,被compileJava任务调用。
  • annotationProcessor 编译期间注解处理。
  • runtimeOnly 只在运行时使用。
  • runtimeClasspath 继承自runtimeOnly, runtime, implementation,包含implementation元素的运行时路径。
  • testImplementation 仅在测试执行时依赖。
  • 其他测试相关的依赖配置。略。
  • archives 项目生产构件,任务uploadArchives使用。

扩展

java插件也提供了一些扩展,如下:

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}