目录
6.2.2 api(或 compile,compile 已废弃)
6.2.5 testImplementation 和 testRuntimeOnly
一、Gradle 是什么?为什么要学?
在软件开发的世界里,构建工具就像是幕后英雄,默默推动着项目从代码到可执行程序的转变。Gradle,便是其中一位强大且备受瞩目的角色。它是一个基于 JVM 的开源自动化构建工具 ,结合了 Apache Ant 和 Apache Maven 的优点,旨在帮助开发人员更轻松、自动地完成项目的构建、测试、发布等繁琐流程。
Gradle 之所以脱颖而出,是因为它有着诸多显著优势。在性能方面,它支持增量构建,每次构建时只处理有更改的部分,并且通过任务输入输出缓存机制,减少不必要的工作量,再加上支持并行执行,充分利用处理器资源,大大提高了构建速度。在灵活性与扩展性上,Gradle 使用 Groovy 或 Kotlin 编写构建脚本,提供丰富的插件,开发者能根据项目需求灵活定制,官方也提供了强大的功能支持,通过各类插件可实现对各种功能的灵活管理。在依赖管理上,Gradle 对复杂依赖关系的处理十分友好,能处理传递性依赖、解析依赖版本冲突等,还可配置多个仓库,如 Maven Central、jCenter、自定义仓库等,满足项目多样化的依赖需求。同时,Gradle 还支持多项目构建与管理,能协调多个项目间的依赖关系和构建过程,为大型项目的维护提供了便捷方式。不仅如此,Gradle 与各种 IDE(如 IntelliJ IDEA、Eclipse、Android Studio )无缝集成,也能与 CI/CD 工具(如 Jenkins、GitLab CI、Travis CI 等)集成,助力实现从开发到上线的全套自动化部署流程。此外,Gradle 拥有活跃的社区和丰富的文档资源,开发者可便捷获取帮助,社区提供的众多插件也能让 Gradle 更好地适应不断变化的需求。
对于开发者而言,掌握 Gradle 意味着拥有更高的工作效率和更强的项目掌控能力。在实际开发中,无论是 Java 应用程序构建,还是 Android 应用开发,亦或是大型多项目的管理,Gradle 都能发挥重要作用。并且,随着技术的发展,越来越多的企业和项目开始采用 Gradle,掌握这门技能,无疑能为你的技术栈增添亮眼的一笔,在职业发展中抢占先机。所以,不管你是初入编程世界的新手,还是经验丰富的开发老手,学习 Gradle 都是一项极具价值的投资 。
二、Gradle 与其他构建工具的对比
在构建工具的大家庭里,Gradle 并非孤军奋战,Maven 和 Ant 也是其中的重要成员 ,它们各自有着独特的 “性格” 和 “本领”。
Maven 作为 Java 项目构建的老牌工具,有着 “约定优于配置” 的理念,就像一位严谨的管家,严格遵循着标准化的流程。它使用基于 XML 的 pom.xml 文件来管理项目,从依赖项的引入到构建插件的配置,都有着清晰的结构。例如,当你添加一个 Spring Boot 的 Web 依赖时,在 pom.xml 文件中这样配置:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
这种 XML 配置方式虽然结构化强,易于管理和维护,但也存在明显的缺点,那就是过于冗长繁琐。当项目的依赖和配置增多时,pom.xml 文件会变得臃肿不堪,让人望而生畏。而且,Maven 的构建过程相对僵化,按顺序处理任务,缺乏并行执行的能力,这使得构建大型项目时,速度成为了它的短板。
Ant 则是另一种风格,它诞生于 2000 年,是一个基于 Java 的构建工具,以灵活性高著称。Ant 没有强制的项目目录结构,也没有像 Maven 那样 “约定优于配置” 的理念,开发者可以根据自己的需求自由定制构建过程。它通过编写 XML 文件来定义构建任务,例如:
<project name="MyProject" default="build">
<target name="build">
<echo message="Building project..."/>
<!-- 其他构建任务,如编译、打包等 -->
</target>
</project>
Ant 就像一个万能的工匠,你可以告诉它每一个细节,但这也意味着开发者需要花费更多的精力去编写和维护构建脚本。对于复杂的项目,编写大量的 XML 指令对开发人员来说是一个不小的挑战。
Gradle 则巧妙地融合了 Maven 和 Ant 的优点,成为了构建工具中的 “多面手”。它采用基于 Groovy 或 Kotlin 的 DSL 来配置项目,兼具简洁性与灵活性。比如在 Gradle 中添加 Spring Boot 的 Web 依赖,只需这样配置:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:2.6.2'
}
相比 Maven 的 XML 配置,Gradle 的 DSL 更加简洁明了,可读性更强。在性能方面,Gradle 更是优势明显,它支持增量构建,只重新编译发生更改的代码部分,避免了重复编译整个项目,大大缩短了构建时间。同时,Gradle 还具备依赖项缓存机制和并行执行功能,在处理大型项目时,这些特性使得构建速度大幅提升。在扩展性上,Gradle 基于插件的扩展机制也使得它能够轻松应对各种复杂的项目需求。
三、环境搭建与基本使用
3.1 安装 Gradle
在正式开启 Gradle 的学习之旅前,我们首先得把它请进我们的开发环境。安装 Gradle 的步骤并不复杂,跟着下面的指引,你很快就能完成。
- 下载 Gradle:访问 Gradle 官方网站的下载页面(https://gradle.org/releases/ ) ,这里提供了不同版本的 Gradle 供你选择。通常,建议下载最新稳定版本,以享受最新的功能和性能优化。比如,当前最新版本是 8.2,你可以点击对应的链接下载适合你操作系统的安装包。如果你使用的是 Windows 系统,一般下载.zip格式的文件;若是 Linux 或 macOS 系统,.tar.gz格式更为常见。
- 解压安装包:下载完成后,将压缩包解压到你希望安装 Gradle 的目录。例如,在 Windows 系统中,你可以解压到C:\Program Files\gradle;在 macOS 系统中,解压到/Users/你的用户名/Applications/gradle。解压后的目录结构大致如下,其中bin目录存放着可执行文件,lib目录包含了 Gradle 运行所需的库文件:
gradle-8.2
├── bin
│ ├── gradle
│ └── gradle.bat
├── lib
│ └── ...
└── ...
- 配置环境变量:这一步是让系统能够找到 Gradle 的关键。
-
- Windows 系统:右键点击 “此电脑”,选择 “属性”,在弹出的窗口中点击 “高级系统设置”,然后在 “系统属性” 窗口中点击 “环境变量”。在 “系统变量” 区域找到 “Path” 变量,点击 “编辑”,在弹出的 “编辑环境变量” 窗口中点击 “新建”,将 Gradle 的bin目录路径添加进去,比如C:\Program Files\gradle\gradle-8.2\bin。添加完成后,依次点击 “确定” 保存设置。
-
- Linux 和 macOS 系统:打开终端,编辑你的 Shell 配置文件。如果你使用的是 bash,编辑~/.bashrc文件;若是 zsh,编辑~/.zshrc文件。在文件末尾添加以下两行代码(假设你的 Gradle 安装目录是/Users/你的用户名/Applications/gradle/gradle-8.2):
export GRADLE_HOME=/Users/你的用户名/Applications/gradle/gradle-8.2
export PATH=$GRADLE_HOME/bin:$PATH
添加完成后,保存文件,并执行source ~/.bashrc(bash 用户)或source ~/.zshrc(zsh 用户)使配置生效。
4. 验证安装:打开终端或命令提示符,输入gradle -v,如果安装和配置成功,你将看到 Gradle 的版本信息、构建时间、Kotlin 和 Groovy 版本等详细信息,如下所示:
Welcome to Gradle 8.2!
Here are the highlights of this release:
- Kotlin DSL: new reference documentation, assignment syntax by default
- Kotlin DSL is now the default with Gradle init
- Improved suggestions to resolve errors in console output
For more details see https://docs.gradle.org/8.2/release-notes.html
------------------------------------------------------------
Gradle 8.2
------------------------------------------------------------
Build time: 2023-06-30 18:02:30 UTC
Revision: 5f4a070a62a31a17438ac998c2b849f4f6892877
Kotlin: 1.8.20
Groovy: 3.0.17
Ant: Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM: 11.0.1 (Oracle Corporation 11.0.1+13-LTS)
OS: Mac OS X 10.16 x86_64
3.2 Gradle Wrapper 使用
虽然我们已经成功安装了 Gradle,但在团队协作或项目迁移时,不同成员的 Gradle 版本可能不一致,这就容易引发构建问题。Gradle Wrapper 的出现,就是为了解决这个难题。
Gradle Wrapper 本质上是对 Gradle 的一层封装,它确保了项目使用一致的 Gradle 版本 。当你使用 Gradle Wrapper 时,它会检查本地是否安装了项目指定版本的 Gradle,如果没有,它会自动从指定的仓库下载并使用,避免了手动安装和版本不一致的麻烦。
在一个新的 Gradle 项目中,如果你还没有 Gradle Wrapper,可以通过以下命令生成:
gradle wrapper
执行这个命令后,项目目录下会生成一些与 Gradle Wrapper 相关的文件,主要包括:
- gradlew:这是 Linux 和 macOS 系统下的可执行脚本,用于执行 Gradle 任务。
- gradlew.bat:Windows 系统下对应的批处理脚本。
- gradle/wrapper/gradle-wrapper.jar:包含了 Gradle Wrapper 的核心逻辑,负责下载 Gradle 等操作。
- gradle/wrapper/gradle-wrapper.properties:这个文件非常重要,它定义了项目使用的 Gradle 版本以及下载地址等信息。例如:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-all.zip
其中distributionUrl指定了 Gradle 的下载地址和版本,你可以根据项目需求修改这个版本号,当再次执行gradlew相关命令时,它会自动下载并使用新指定的 Gradle 版本。
使用 Gradle Wrapper 也很简单,在项目根目录下,你可以使用gradlew命令替代gradle命令来执行各种 Gradle 任务。比如查看项目的所有任务:
./gradlew tasks
在 Windows 系统中,使用gradlew.bat:
gradlew.bat tasks
3.3 基本命令操作
Gradle 提供了丰富的命令来满足项目构建的各种需求,以下是一些常用命令及其用途:
- gradle -v:查看 Gradle 的版本信息,包括 Gradle 版本、构建时间、依赖的 Kotlin、Groovy、Ant、JVM 以及操作系统等相关信息,帮助你确认当前使用的 Gradle 环境。
- gradle tasks:列出当前项目中所有可执行的任务,让你快速了解项目的构建任务有哪些,比如常见的clean(清理构建目录)、build(执行完整的构建,包括编译、测试、打包等)、assemble(打包任务,生成可发布的文件,如 JAR 包、WAR 包等)。
- gradle build:这是最常用的构建命令之一,它会依次执行项目的编译、测试、打包等一系列任务,生成最终的可执行文件或发布包。在 Java 项目中,执行gradle build后会在build目录下生成编译后的字节码文件、测试报告以及打包好的 JAR 包等。
- gradle clean:用于清理项目的构建目录,删除build目录下的所有文件和目录,为下一次构建做好准备,避免因残留文件导致的构建问题。
- gradle assemble:专注于打包任务,根据项目的配置,生成对应的可发布文件。例如在 Android 项目中,执行gradle assemble会生成 APK 文件;在 Java Web 项目中,可能会生成 WAR 包。
- gradle test:执行项目中的单元测试用例,并生成测试报告。通过这个命令,你可以快速验证代码的正确性,及时发现代码中的问题。例如,在一个 Java 项目中,如果有 JUnit 测试用例,执行gradle test会运行这些测试用例,并在build/reports/tests目录下生成详细的测试报告。
四、Gradle 构建文件详解
4.1 build.gradle 文件剖析
在 Gradle 项目中,build.gradle文件可谓是核心中的核心,它就像是项目构建的指挥中心,所有关于项目构建的重要指令都在这里下达。一个典型的build.gradle文件主要包含以下几个关键部分:
4.1.1 插件应用
插件是 Gradle 功能扩展的关键,通过应用插件,我们可以为项目引入各种强大的功能。在build.gradle文件中,使用plugins块来应用插件 。例如,在一个 Java 项目中,我们通常会应用java插件,它提供了编译、测试、打包等一系列 Java 项目常用的构建任务:
plugins {
id 'java'
}
如果是一个 Android 项目,就需要应用com.android.application插件(对于应用模块)或com.android.library插件(对于库模块) ,以支持 Android 项目的构建:
plugins {
id 'com.android.application'
}
插件不仅能让我们轻松复用已有的构建逻辑,还能根据项目的特殊需求进行定制开发,极大地提高了构建的灵活性和效率。
4.1.2 项目配置
项目配置部分用于定义项目的各种属性和设置,不同类型的项目配置内容会有所不同。以 Java 项目为例,在build.gradle文件中可以配置项目的源文件目录、目标 Java 版本等。比如:
sourceSets {
main {
java {
srcDirs 'src/main/java'
}
resources {
srcDirs 'src/main/resources'
}
}
test {
java {
srcDirs 'src/test/java'
}
resources {
srcDirs 'src/test/resources'
}
}
}
这里通过sourceSets块定义了项目的主源代码目录src/main/java和资源目录src/main/resources,以及测试源代码目录src/test/java和测试资源目录src/test/resources。同时,还可以指定项目使用的 Java 版本:
apply plugin: 'java'
sourceCompatibility = 11
ta