build.gradle
是什么? 想象一下,你有一个大型的乐高项目,你需要一个清单来列出所有的乐高积木和它们如何组合在一起。在软件开发中,build.gradle
就是这个清单,它告诉计算机如何构建(组合)你的软件项目。- 为什么每个项目都有一个
build.gradle
文件? 每个项目都像是一个独立的乐高套装,每个套装都有自己的清单来确保所有的积木(代码和资源)都能正确地组合在一起。这个清单就是build.gradle
文件。 build.gradle
文件里有什么? 在这个清单中,你会指定你的项目需要哪些积木(依赖库),这些积木的版本是什么,以及一些特殊的构建规则(比如如何编译代码)。- 什么是 Project 实例? 可以把 Project 实例想象成一个项目经理,它负责管理你的乐高项目。
build.gradle
文件中的配置实际上是在告诉这个项目经理如何管理项目。 - Root Project 和 Child Project 是什么? 如果你有一个大型的乐高项目,它可能由几个小项目组成。Root Project 就像是总负责人,它可以管理所有的小项目(Child Project)。在 Root Project 的
build.gradle
文件中,你可以为所有这些小项目设置一些共同的规则,比如它们都需要哪些通用的积木或者如何找到这些积木。
build 文件中常见的属性和方法如下所示:
1、常见属性代码
1.1 JDK版本兼容性设置
-
sourceCompatibility: 指定使用哪个版本的JDK语法来编译源代码。这与编译环境有关,且需要Java插件支持。
sourceCompatibility = 1.8
-
targetCompatibility: 指定生成特定于某个JDK版本的class文件。这与运行环境有关,同样需要Java插件支持。
targetCompatibility = 1.8
1.2. 字符集设置
-
编译Java选项字符集: 设置业务编码的字符集,用于源码解码。
compileJava.options.encoding "UTF-8"
-
编译测试Java选项字符集: 设置测试编码的字符集,同样用于源码解码。
compileTestJava.options.encoding "UTF-8"
-
Java编译任务字符集: 在编译Java文件时指定使用UTF-8字符集,这影响源文件的编码。
tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
-
Javadoc任务符集: 在生成Javadoc文档时指定使用UTF-8字符集,这影响文档的编码。
tasks.withType(Javadoc) { options.encoding = "UTF-8" }
-
提示1:
group+name+version
的格式类似于Maven中的group+artifactId+version
,用于标识项目的唯一性。 -
提示2: 设置
encoding
属性可以解决业务代码和测试代码中的中文乱码问题。
2、仓库配置 (Repositories)
在Gradle中,仓库的配置顺序很重要,因为Gradle会按照配置的顺序从上到下依次搜索所需的jar包。一旦找到所需的依赖,Gradle将停止搜索,继续进行构建。
repositories {
// 使用本地文件系统的仓库,通常不推荐使用
maven { url 'file:///D:/repos/mavenrepos3.5.4' }
maven { url "$rootDir/lib/release" }
// 指定查找Maven的本地仓库,通常Gradle会自动配置
mavenLocal()
// 指定查找Maven的私服或第三方镜像仓库
maven { name "Alibaba"; url "https://maven.aliyun.com/repository/public" }
maven { name "Bstek"; url "https://nexus.bsdn.org/content/groups/public/" }
// 指定查找Maven的中央仓库,这是默认的远程仓库
mavenCentral()
// 指定查找Google的远程仓库
google()
}
2.1 仓库配置说明
-
本地文件系统仓库:通过
file
协议指定本地磁盘目录作为仓库,这种方式不常用。 -
Maven本地仓库:
mavenLocal()
配置允许Gradle在本地Maven仓库中查找依赖。 -
第三方镜像仓库:例如
Alibaba
和Bstek
,这些是公共的Maven仓库镜像,通常用于加速依赖下载,特别是在某些地区访问Maven中央仓库速度较慢时。 -
Maven中央仓库:
mavenCentral()
配置允许Gradle查找默认的Maven中央仓库,这是最常用的远程仓库之一。 -
Google仓库:
google()
配置允许Gradle查找Google的远程仓库,这通常包含了一些Android开发常用的库。
2.2 注意事项
- Gradle默认配置了Maven中央仓库,通常不需要手动添加。
- 在配置私服或第三方镜像时,需要确保网络可以访问这些仓库。
- 仓库配置应该根据项目的实际需求和网络环境进行调整。
3、allprojects和subprojects配置
在Gradle中,allprojects
和subprojects
允许你为多个项目(包括根项目和所有子项目)统一配置一些构建设置。
- allprojects:对根项目以及所有子项目进行统一配置。
- subprojects:仅对所有子项目进行统一配置。
// 对所有项目(包括根项目和子项目)配置一个名为 'hello' 的任务
allprojects {
tasks.create('hello') {
doLast {
task ->
println "project name is $task.project.name"
}
}
}
// 对所有子项目配置 'hello' 任务的额外行为
subprojects {
hello.doLast {
task ->
println "here is subprojects $task.project.name"
}
}
// 拓展:单独为一个子项目配置任务
project(':subject01') { // 注意这里是字符串加冒号的语法来指定子项目
tasks.create('subject01') {
doLast {
println 'for subject01'
}
}
}
拓展说明
根项目配置:如果你在根项目的构建脚本中直接配置
repositories
和dependencies
,则这些配置只对根项目有效。单独项目配置:你可以使用
project('子项目路径')
来单独为一个子项目配置任务或其他构建设置。
执行测试:
要查看测试效果,你可以在终端或命令行中运行
gradle build
指令。这将触发所有项目的构建过程,并执行你在allprojects
和subprojects
中定义的任务。
注意事项
- 在
allprojects
和subprojects
中定义的任务是惰性配置的,意味着它们只在实际执行时才会被创建。 - 使用
project('子项目路径')
时,需要确保路径正确,并且该子项目已经在你的多项目构建中被定义。 - 过度使用
allprojects
和subprojects
可能会使构建配置变得难以管理,因此建议只在真正需要统一配置时使用。
4、ext 用户自定义属性
在Gradle中,ext
(extension)属性允许用户在Project和Task对象中定义自定义属性。这些属性可以在构建脚本中读取和设置,也可以通过代码块一次性定义多个属性。
示例
// 自定义一个Project的属性
ext.age = 18
// 通过代码块同时自定义多个属性
ext {
phone = 110
address = "警察局"
}
// 在task中自定义属性
task extCustomProperty {
// 使用ext代码块在task中定义自定义属性
ext {
desc = "奥利给"
}
doLast {
println "年龄是:${age}"
println "电话是:${phone}"
println "地址是:${address}"
println "阿杰:${desc}"
}
}
测试
要测试自定义属性,可以在命令行中运行:
gradle extCustomProperty
输出结果将为:
年龄是:18
电话是:110
地址是:警察局
阿杰:奥利给
拓展 1: gradle.properties
配置:
gradle.properties
文件用于定义系统属性、环境变量、项目属性和JVM相关配置。这些属性在项目运行时自动加载,可以用来调整Gradle的行为和性能。
示例
# 设置JVM参数以避免内存溢出
org.gradle.jvmargs=-Xms4096m -Xmx8192m
# 开启Gradle缓存
org.gradle.caching=true
# 开启并行编译
org.gradle.parallel=true
# 启用新的孵化模式
org.gradle.configureondemand=true
# 开启守护进程
org.gradle.daemon=true
更多关于Gradle配置属性的信息,可以参考官方文档:
- Configuring the Build Environment
5、Buildscript
buildscript
块用于定义Gradle构建过程中所需的依赖,这些依赖通常是一些插件或库,它们对于执行构建脚本是必要的。buildscript
必须位于build.gradle
文件的最前端。
示例
import org.apache.commons.codec.binary.Base64
buildscript {
repositories {
mavenCentral()
}
dependencies {
// 添加commons-codec库到构建脚本的类路径
classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
}
}
// 注册一个名为'encode'的任务
tasks.register('encode') {
doLast {
// 使用Base64编码hello world字符串
def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())
println new String(encodedString)
}
}
注意事项
- 位置:
buildscript{}
必须位于build.gradle
文件的最前端。 - 多项目构建:在多项目构建中,根项目的
buildscript()
声明的依赖关系可用于其所有子项目的构建脚本。 - Gradle插件:构建脚本依赖也可能是Gradle插件,它们可以提供额外的构建功能。
插件应用示例
buildscript {
ext {
springBootVersion = "2.3.3.RELEASE"
}
repositories {
mavenLocal()
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
jcenter()
}
// 添加Spring Boot插件到构建脚本的类路径
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
// 应用核心Java插件
apply plugin: 'java'
// 应用Spring Boot插件
apply plugin: 'org.springframework.boot'
在这个示例中,我们首先定义了一个扩展属性springBootVersion
,然后在buildscript
的dependencies
块中使用这个属性来指定Spring Boot插件的版本。接着,我们通过apply plugin
语句应用了Java核心插件和Spring Boot插件。
拓展
- 仓库服务:您提供的链接指向了阿里云的Maven仓库服务,这是一个私有Maven制品仓库,可以用于存储和管理制品,如二进制库和插件。