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()
有几点很大的不同。
plugins{}
不能包含任何的代码。plugins {}
只能用在项目的build script和settings.gradle文件中,不能用在脚本插件或init scripts中。- 在多项目结构中,
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
}