简介
build.gradle
是gradle构建脚本文件,支持java、groovy等语言。
每个gradle项目或模块都会有一个build.gradle
文件,该文件是项目构建的入口,可配置版本、插件依赖库等信息。
每个build
文件都有一个对应的project
实例,配置build.gradle
文件,实际就是设置project
实例里面的属性,或者调用里面的方法。
根项目的project
实例可以获取到所有子项目或子模块的project
实例,因此我们可以在根项目的build.gradle
文件中对子项目进行统一配置,比如应用插件、依赖的maven中心仓库等,常见的build.gradle
属性及方法如下所示:
常见属性代码
// 指定使用什么版本的JDK语法编译源代码,跟编译环境有关,在有java插件时才能用
sourceCompatibility = 1.8
// 指定生成特定于某个JDK版本的class文件:跟运行环境有关,在有java插件时才能用
targetCompatibility = 1.8
// 业务编码字符集,注意这是指定源码解码的字符集[编译器]
compileJava.options.encoding "UTF-8"
// 测试编码字符集,注意这是指定源码解码的字符集[编译器]
compileTestJava.options.encoding "UTF-8"
// 编译JAVA文件时采用UTF-8:注意这是指定源码编码的字符集【源文件】
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
// 编译JAVA文件时采用UTF-8:注意这是指定文档编码的字符集【源文件】
tasks.withType(Javadoc) {
options.encoding = "UTF-8"
}
仓库
repositories {
// gradle中会按着仓库配置的顺序,从上往下依次去对应的仓库中找所需要的jar包:
// 如果找到,则停止向下搜索,如果找不到,继续在下面的仓库中查找
// 指定去本地某个磁盘目录中查找:使用本地file文件协议:一般不用这种方式
maven { url 'file:///D:/repos/mavenrepos3.5.4'}
maven { url "$rootDir/lib/release" }
// 指定去maven的本地仓库查找
mavenLocal()
//指定去maven的私服或者第三方镜像仓库查找
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }
// 指定去maven的远程仓库查找:即 https://repo.maven.apache.org/maven2/
mavenCentral()
// 去google仓库查找
google()
}
subprojects和allprojects
例如:
allprojects {
tasks.create("all_test") {
println("Here we are at ${project.name}")
}
}
subprojects {
tasks.create("test_sub") {
println("Here we are at ${project.name} in subproject")
}
}
执行gradle build
后的输出如下:
(base) PS D:\develop\ideaWorkspace\GradleTest> gradle build -q
Here we are at GradleTest
Here we are at lib1
Here we are at lib2
Here we are at lib3
Here we are at myplugin
Here we are at lib1_1
Here we are at lib1_2
Here we are at lib1 in subproject
Here we are at lib2 in subproject
Here we are at lib3 in subproject
Here we are at myplugin in subproject
Here we are at lib1_1 in subproject
Here we are at lib1_2 in subproject
可见在subprojects
的输出中,没有根项目GradleTest
。一般来说,subprojects
和allprojects
是用来配置依赖的。我们也可以通过按名字或相对路径对某个项目进行单独配置:
project("lib2" /*或者:lib2*/ ) {
tasks.create("test_sub2") {
println("Here we are at ${project.name} in subproject test 2")
}
}
ext自定义属性
Project
和Task
对象都允许用户添加额外的自定义属性,通过读写ext
属性即可实现。如果要同时添加多个自定义属性,通过ext
代码块即可:
ext.age = 25
ext {
name = "szc"
phone = "1234"
}
task "test_ext" {
ext {
desc = "nothing much"
}
doLast {
println "name: ${name}\nphone: ${phone}\nage: ${age}\ndescription: ${desc}"
}
}
输出如下:
> Task :test_ext
name: test_ext
phone: 1234
age: 25
description: nothing much
系统信息、环境变量、项目属性、JVM配置等信息可在gradle.properties
中定义,例如:
# 设置此参数主要是编译下载包会占用大量的内存,可能会内存溢出
org.gradle.jvmargs=-Xms4096m -Xmx8192m
# 开启gradle缓存
org.gradle.caching=true
# 开启并行编译
org.gradle.parallel=true
# 启用新的孵化模式
org.gradle.configureondemand=true
# 开启守护进程
org.gradle.daemon=true
buildscript
buildscript
代码段是gradle脚本所需依赖,包括maven库和插件,示例:
import org.apache.commons.codec.binary.Base64
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
}
}
tasks.register('encode') {
doLast {
def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())
println new String(encodedString)
}
}
需要注意的是:
1)、buildscript
代码段必须是build.gradle
文件的第一个代码段;
2)、对于多模块构建,项目的buildscript
代码段声明的依赖关系可用于所有子模块的构建脚本;
3)、构建脚本的依赖可能是gradle插件
比如以前在插件一文用的示例:
// 使用传统的应用方式,且buildScript标签必须在所有标签之前
buildscript {
ext {
springBootVersion = "2.3.3.RELEASE"
}
repositories {
mavenLocal()
}
// 此处先引入插件
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
.....
// 而后再应用插件,在plugins标签之后应用
apply plugin: 'org.springframework.boot' // 社区插件,需要事先引入,不必写版本号