写点什么

高效开发 Gradle 架构设计图解 / 掌握项目工程自动化技巧 (精通篇一)

作者:肖哥弹架构
  • 2024-12-08
    河北
  • 本文字数:7684 字

    阅读完需:约 25 分钟

高效开发Gradle架构设计图解/掌握项目工程自动化技巧(精通篇一)


Gradle 是一个强大的自动化构建工具,它通过灵活的构建脚本和丰富的插件生态系统,为 Java 和其他语言的项目提供了现代化的构建解决方案。无论您是构建简单的应用还是复杂的多模块项目,Gradle 都能以其高效的性能和卓越的可扩展性满足您的需求。本文将引导您深入了解 Gradle 的核心概念、最佳实践和高级技巧,帮助您充分利用这一强大的工具。


肖哥弹架构 跟大家“弹弹” 高并发锁, 关注公号回复 'mvcc' 获得手写数据库事务代码

欢迎 点赞,关注,评论。

关注公号 Solomon 肖哥弹架构获取更多精彩内容

历史热点文章

1、Gradle 介绍

Gradle 是一个开源的构建自动化工具,它足够灵活,可以构建几乎任何类型的软件。以下是 Gradle 的一些核心特点和功能:


  1. 灵活性:Gradle 使用 Groovy 或 Kotlin 编写构建脚本,提供了高度的灵活性和可定制性。

  2. 依赖管理:Gradle 提供了强大的依赖管理功能,支持从多种来源(如 Maven 中央仓库、本地 JAR 文件和远程仓库)获取依赖,并能自动解析和下载依赖。

  3. 多项目构建:Gradle 支持多项目构建,能够轻松处理由多个子项目组成的复杂项目结构。

  4. 增量构建:Gradle 具备优秀的增量构建能力,只重新构建发生更改的部分,从而显著减少构建时间。

  5. 可扩展性:通过编写自定义插件和任务,可以将 Gradle 扩展到满足特定项目的需求,并且有丰富的第三方插件库可供选择。

  6. 与现有工具的兼容性:尽管 Gradle 有自己的构建脚本格式,但它仍然与 Maven 和 Ant 等传统的构建工具兼容。

  7. 性能:Gradle 通过增量构建和构建缓存等特性,优化了构建性能。

  8. IDE 支持:主流的 IDE 都支持导入 Gradle 构建并且通过图形化界面的方式与 Gradle 进行交互。

  9. 声明式构建:Gradle 汲取了 Maven 的长处,以 Java 项目为例,只要将合适的文件放在合适的地方,应用合适的插件就可以简单地执行构建。

  10. 跨平台:作为一个基于 JVM 的工具,Gradle 可以轻易地实现跨平台构建。


Gradle 的设计哲学是提供一种灵活且强大的构建系统,它结合了 Ant 的灵活性和 Maven 的依赖管理能力,同时提供了更简洁和强大的构建脚本编写方式。这些特性使得 Gradle 成为现代软件开发中一个非常受欢迎的构建工具。

2、Gradle 设计思路

Gradle 的设计起源于对更高效、灵活的构建工具的需求。以下是 Gradle 设计的几个关键点:


  1. 对 Ant 和 Maven 的继承与发展

  2. Gradle 是基于 Apache Ant 和 Apache Maven 的概念开发的项目自动化构建工具。它继承了 Maven 的依赖管理和项目结构约定,同时吸收了 Ant 的灵活性。

  3. 对 XML 配置的改进

  4. 在早期的构建工具如 Ant 和 Maven 中,项目配置通常使用 XML 文件,这使得配置变得繁琐且难以维护。Gradle 采用基于 Groovy 的特定领域语言(DSL)来声明项目设置,抛弃了基于 XML 的配置,使得构建脚本更加简洁、易读。

  5. 灵活性和可扩展性的需求

  6. 随着项目复杂度的增加,开发者需要一个更加灵活和可扩展的构建工具。Gradle 的设计初衷是提供一个灵活、可扩展的构建工具,能够适应各种复杂的项目需求。

  7. 性能优化

  8. Gradle 引入了增量构建和构建缓存等特性,优化了构建性能,使得构建过程更加快速。

  9. 多语言项目的支持

  10. Gradle 不仅支持 Java 项目,还广泛支持其他语言的项目,如 Groovy、Kotlin、Scala 等,这使得它在多语言项目中非常受欢迎。

  11. 社区的推动

  12. Gradle 是一个开源项目,遵循 Apache License 2.0 协议。它的优良特性吸引了很多开发者并形成了活跃的 Gradle 社区,许多开源软件开发者为 Gradle 的核心代码做出了贡献。

  13. 与现有工具的兼容性

  14. 尽管 Gradle 有自己的构建脚本格式,但它仍然与 Maven 和 Ant 等传统的构建工具兼容,可以解析 Maven 的 pom.xml 文件,并使用 Maven 仓库中的依赖项。

3、Gradle 工程结构

一个典型的 Gradle 工程结构如下:


my-gradle-project/├── .gradle│   └── <gradle执行信息>├── .idea│   └── <项目的配置信息,包括版本控制信息>├── build│   ├── classes│   ├── resources│   └── <项目输出路径,包括编译后的.class文件和资源文件>├── src│   ├── main│   │   ├── java│   │   ├── resources│   │   └── <程序源码和资源文件>│   └── test│       ├── java│       └── resources│       └── <测试源码和资源文件>├── build.gradle│   └── <当前module的Gradle配置文件>└── settings.gradle    └── <针对module的全局配置,包含所有module的配置>
复制代码

主要目录和文件的作用:

  1. .gradle:存放 Gradle 的执行信息。

  2. .idea:存放项目的配置信息,包括版本控制信息等,这个文件夹是自动生成的。

  3. build:项目输出路径,包括编译后的.class文件(classes文件夹下),资源文件(resources文件夹下)。

  4. src:项目源码,包含程序源码和测试源码。

  5. build.gradle:当前 module 的 Gradle 配置文件,定义项目的构建配置和依赖管理。

  6. settings.gradle:针对 module 的全局配置,它的作用域所包含的所有 module 是通过settings.gradle来配置。

4、Gradle 对比 maven 的优势

  1. 构建速度

  2. Gradle 在纯净构建时比 Maven 快 2-10 倍,在增量构建时快约 7-85 倍。当 Gradle 任务输出被缓存时,速度提升可达 13 倍。

  3. 在所有场景下,Gradle 至少比 Maven 快 2 倍。子项目越多,Gradle 的速度优势越明显。

  4. 灵活性和配置

  5. Gradle 使用基于 Groovy 或 Kotlin 的 DSL 编写的build.gradle文件,相较于 Maven 的 XML 配置文件,Gradle 的配置更加简洁、直观。

  6. Gradle 的灵活性允许高度定制化的构建脚本,适合构建复杂度较高的项目。

  7. 依赖管理

  8. Gradle 的依赖管理在处理复杂的依赖场景时更加灵活,能更好地处理传递依赖的版本冲突问题。

  9. 插件生态

  10. Gradle 的插件生态在逐渐完善,提供了许多针对不同场景的插件,尤其是在移动开发领域。

  11. 构建缓存

  12. Gradle 支持构建缓存,这在分支之间切换时非常有用,因为先前构建的输出被保留并且不必重新创建,显著提升了性能。

  13. 增量构建

  14. Gradle 实现了增量构建机制,仅重新构建被更改的部分,而 Maven 则需要重新编译整个项目。

  15. 守护进程机制

  16. Gradle 通过守护进程机制避免了每次构建都初始化需要的组件和服务,同时缓存项目结构、文件、任务和其他信息,从而提升运行速度。

  17. 易于扩展

  18. Gradle 可以方便地编写自定义任务和插件,提供了丰富的 API 和插件机制。

  19. 集成与兼容性

  20. Gradle 与许多现代 IDE(如 IntelliJ IDEA、Android Studio 等)紧密集成,提供了良好的开发体验,并且支持与其他构建工具(如 Ant、Maven 等)的集成。


这些优势使得 Gradle 在处理大型项目、需要高度定制化构建逻辑、以及追求构建速度和效率的场景中,成为比 Maven 更受欢迎的选择。

5、Gradle 的内部结构

Gradle 架构组件解释:

  1. 核心自动化平台

  2. core-runtime 模块:提供运行时环境,包括 Gradle 客户端、守护进程和工作进程。

  3. core-configuration 模块:允许构建结构和工作(如任务)的指定,包括项目模型和 DSL。

  4. core-execution 模块:高效执行工作,包括调度、执行、缓存等。

  5. 软件开发平台

  6. 建立在核心自动化平台之上,为软件开发自动化提供支持,包括编译、测试、文档化软件以及通过发布和依赖管理共享软件。

  7. JVM 平台

  8. 建立在核心和软件平台之上,为 JVM 上运行的软件开发提供支持,包括 Java、Kotlin 或其他 JVM 语言实现的软件。

  9. 扩展性平台

  10. 建立在核心、软件和 JVM 平台之上,为扩展 Gradle 提供支持,包括实现和应用插件。

  11. 本地平台

  12. 建立在核心和软件平台之上,为原生软件开发提供支持。

  13. 企业模块

  14. 提供企业级的功能和模块。

6、Gradle 框架设计

Gradle 架构组件解释:

  • 构建系统:Gradle 的整体构建系统。

  • 核心自动化:Gradle 的核心功能,包括构建配置、依赖管理、插件应用和任务执行。

  • 构建配置:负责项目的构建配置。

  • 依赖管理:处理项目的依赖关系。

  • 插件应用:允许通过插件扩展 Gradle 的功能。

  • 任务执行:执行定义好的构建任务。

  • 多项目管理:支持多模块和多项目的构建。

  • 子项目构建:能够独立构建每个子项目。

  • 构建缓存:通过构建缓存提高构建速度。

  • 并行执行:支持任务的并行执行,进一步提升构建速度。

  • 与 Maven 兼容:能够导入 Maven 项目,保持与 Maven 的兼容性。

7、Gradle 执行流程图

Gradle 执行流程解释:

  1. 初始化阶段(Initialization)

  2. 在这个阶段,Gradle 执行settings.gradle文件,确定参与构建的项目集,并为每个项目创建一个Project实例。

  3. 配置阶段(Configuration)

  4. 这个阶段,Gradle 加载并评估所有项目的build.gradle文件,配置Project对象,并生成任务图。

  5. 执行阶段(Execution)

  6. 在执行阶段,Gradle 根据任务依赖关系执行选定的任务。

详细流程:

  • A[开始构建] :触发 Gradle 构建的开始。

  • B[初始化阶段] :包括执行settings.gradle脚本和创建项目层次结构。

  • B1(settings.gradle)settings.gradle文件执行,确定构建的项目。

  • B2[项目层次结构] :为每个项目创建Project实例。

  • C[配置阶段] :包括加载build.gradle文件和任务图的生成。

  • C1(build.gradle)build.gradle文件执行,配置项目。

  • C2[依赖关系解析] :解析任务依赖关系。

  • D[执行阶段] :根据依赖关系执行任务。

  • D1[任务执行] :按依赖顺序执行任务。

  • D2[任务完成] :所有任务执行完毕。

  • E[构建完成] :构建过程结束。


这个流程图简洁地展示了 Gradle 构建的三个阶段及其关键活动,帮助理解 Gradle 如何管理和执行构建任务。

8、settingns.gradle 相关组件和模块

settings.gradle 配置相关组件和模块解释:

  • settings.gradle:Gradle 多项目构建的配置文件。

  • 子项目 Include:使用include方法包含子项目,定义项目结构。

  • 根项目属性 Root Project:设置根项目的属性,如rootProject.name

  • 子项目属性 Subprojects:对所有子项目应用通用配置,如版本控制和插件应用。

  • 远程仓库 Repositories:配置项目依赖和插件的远程仓库,如mavenCentral()

  • 版本管理 Version Management:管理项目依赖的版本,使用版本目录。

  • Gradle 属性 Gradle Properties:设置 Gradle 属性,如org.gradle.parallel

  • 构建源代码 buildSrc:配置buildSrc目录,用于存放共享的构建逻辑和插件。

  • 组合构建 Composite Builds:如果使用组合构建,在此配置,允许将多个独立构建组合成一个逻辑构建。


settings.gradle配置中涉及的相关组件和模块的详细说明,以及它们在 Gradle 构建中的作用:

8.1. 子项目 Include

说明:在settings.gradle文件中,include语句用于包含子项目,这些子项目成为根项目的一部分,构成多项目构建的骨架。 作用:允许您在一个统一的构建中管理多个项目,使得项目结构更加清晰,便于维护。


include 'api', 'web', 'shared'
复制代码

8.2. 根项目属性 Root Project

说明:在settings.gradle中,您可以为根项目设置名称和其他属性,这些属性在整个构建中是唯一的。 作用:定义根项目的基本信息,如项目名称,这对于构建的组织结构至关重要。


rootProject.name = 'my-root-project'
复制代码

8.3. 子项目属性 Subprojects

说明subprojects块允许您对所有子项目应用通用配置,如插件应用、版本控制和源兼容性设置。 作用:提供了一种方便的方式来为所有子项目配置通用的构建逻辑,确保构建的一致性。


subprojects {    apply plugin: 'java'    version = '1.0-SNAPSHOT'    sourceCompatibility = 1.8}
复制代码

8.4. 远程仓库 Repositories

说明:在settings.gradle中配置远程仓库,这些仓库用于依赖管理和插件下载。 作用:确保所有项目都能从指定的仓库中检索依赖和插件,这对于构建的可重复性和一致性至关重要。


repositories {    mavenCentral()    jcenter()    maven { url 'https://repo.example.com/maven-releases' }}
复制代码

8.5. 版本管理 Version Management

说明:使用版本目录(Version Catalogs)来管理项目依赖的版本,这有助于保持依赖版本的一致性。 作用:简化版本号的管理,使得更新和维护依赖版本变得更加容易。


dependencyResolutionManagement {    versionCatalogs {        libraries {            version('paging', '3.1.1')            version('glide', '4.14.2')        }    }}
复制代码

8.6. Gradle 属性 Gradle Properties

说明:在settings.gradle中设置 Gradle 属性,这些属性可以影响 Gradle 的构建行为。 作用:提供了一种方式来控制 Gradle 的特定行为,如并行执行任务。


gradle.properties['org.gradle.parallel'] = 'true'
复制代码

8.7. 构建源代码 buildSrc

说明buildSrc目录用于存放共享的构建逻辑,如自定义 Gradle 插件和任务。 作用:允许在多个项目之间共享构建逻辑,减少代码重复,提高构建的可维护性。


// buildSrc目录下的构建逻辑
复制代码

8.8. 组合构建 Composite Builds

说明:组合构建允许将多个独立的构建组合成一个逻辑构建,这在需要重用构建逻辑或共享配置时非常有用。 作用:提供了一种灵活的方式来组织和管理大型项目,使得项目结构更加清晰,便于维护。


includeBuild 'path/to/other/build'
复制代码

8.9、详细的settings.gradle配置示例

// settings.gradle
// 定义根项目的名称rootProject.name = 'my-multi-project'
// 包含子项目,这些子项目将作为根项目的子模块include( 'projectA', // 第一个子项目 'projectB', // 第二个子项目 'commonLib' // 一个共享库项目)
// 定义项目间依赖时使用的版本dependencyResolutionManagement { versionCatalogs { libraries { lib 'org.springframework.boot:spring-boot-starter-web', '2.5.2' lib 'com.fasterxml.jackson.core:jackson-databind', '2.12.3' } }}
// 配置远程仓库,所有子项目将从这些仓库中检索依赖和插件repositories { // 配置 Maven Central 仓库 mavenCentral() // 配置 JCenter 仓库 jcenter() // 配置一个自定义的远程 Maven 仓库 maven { url 'https://repo.example.com/maven-releases' }}
// 配置插件仓库,用于检索 Gradle 插件pluginManagement { repositories { gradlePluginPortal() // 配置 Gradle 插件门户 mavenCentral() }}
// 配置构建源代码目录 buildSrc,用于存放共享的构建逻辑和插件buildSrc { // 定义 buildSrc 目录中的依赖 dependencies { classpath 'org.gradle:gradle-tooling-api:5.6.4' classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.2' }}
// 如果使用组合构建,包含其他独立的构建compositeBuild { // 包含一个本地的组合构建 includeBuild '../other-build' // 包含一个远程的组合构建 includeBuild 'https://github.com/username/other-build.git'}
// 在 settings.gradle 中也可以配置一些 Gradle 属性gradle { // 设置 Gradle 是否并行执行任务 parallel = true // 设置 Gradle 用户的主目录 gradleUserHome = file('/path/to/gradle/user/home')}
// 日志配置,用于控制构建过程中的日志输出logging { console = ConsoleLogger.Level.INFO // 设置控制台日志级别为 INFO debug = false // 设置是否输出调试日志}
复制代码

9、build.gradle 相关组件或模块关系画


build.gradle 文件是 Gradle 构建系统的核心,它用于定义项目的构建逻辑和配置。每个 Gradle 项目都有一个或多个 build.gradle 文件,它们描述了如何构建项目。以下是 build.gradle 文件的一些主要作用和功能:


  1. 插件应用

  2. build.gradle 文件中可以使用 apply plugin 语句来应用插件,这些插件可以提供额外的构建功能和任务。

  3. 依赖配置

  4. build.gradle 文件中,你可以定义项目所需的依赖项,这些依赖可以是库、框架或其他模块。

  5. 任务定义

  6. 可以定义自定义的构建任务(tasks),这些任务可以执行编译、测试、打包、部署等操作。

  7. 构建逻辑

  8. 描述项目的构建逻辑,包括任务之间的依赖关系和执行顺序。

  9. 源代码和资源配置

  10. 配置源代码目录和资源文件,指定哪些文件应该被包含在构建中。

  11. 构建版本管理

  12. 定义项目的版本号,以及如何根据版本号生成输出的构建文件。

  13. 编译选项

  14. 设置编译选项,如源代码兼容性、优化级别、编码等。

  15. 测试配置

  16. 配置测试框架和测试选项,如测试任务、测试报告的生成等。

  17. 打包和发布

  18. 定义打包(如 JAR、WAR)和发布配置,包括归档内容和发布到仓库的设置。

  19. 多项目构建

  20. 在多项目构建中,build.gradle 文件可以定义项目层次结构和子项目之间的依赖关系。

  21. 自定义构建行为

  22. 通过 Groovy 或 Kotlin 脚本,可以编写自定义的构建逻辑和插件。

  23. 环境配置

  24. 根据不同的环境(开发、测试、生产)配置不同的构建选项。

  25. 报告和文档生成

  26. 配置生成代码覆盖率报告、JavaDoc、用户文档等。

  27. 质量控制

  28. 集成代码质量检查工具,如 Checkstyle、PMD、FindBugs 等。


build.gradle 文件是 Gradle 构建的脚本文件,它使用 Groovy 语言(或 Kotlin DSL)编写,提供了极大的灵活性和强大的功能,使得构建过程可以根据项目的特定需求进行定制。

9.1 插件应用

Gradle 插件设计架构

Gradle 插件的设计架构可以分为以下几个关键层次:


  1. 底层 Gradle 框架

  2. 提供基础服务,如任务依赖、有向无环图的构建等。

  3. Google 编译工具团队的 Android Gradle plugin 框架

  4. 在 Gradle 框架的基础上,创建与 Android 项目打包相关的任务和 artifacts。

  5. 开发者自定义 Plugin

  6. 在 Android Gradle plugin 提供的任务基础上插入自定义任务或增加 Transform 进行编译时代码注入。

Gradle 插件的构建过程

Gradle 插件的构建过程主要包括以下几个步骤:


  1. 插件源代码编译

  2. 将插件的源代码编译成字节码。

  3. 插件 JAR 包打包

  4. 将插件的字节码和资源文件打包成一个 JAR 包。

  5. 插件元数据生成

  6. 生成插件的元数据,包括插件的名称、版本、作者等信息。

  7. 插件发布

  8. 将插件发布到插件仓库中,供其他用户下载和使用。

Gradle 插件的执行过程

当 Gradle 执行项目时,它会加载项目中所依赖的所有插件,并按照插件的依赖关系顺序加载。插件加载完成后,Gradle 执行插件的apply方法,该方法是插件的入口方法,负责将插件功能应用到项目中。在apply方法中,插件可以添加任务、扩展项目配置、注册构建监听器等。

Gradle 插件架构图


Gradle 插件设计架构图说明:


  • Gradle 框架

  • 作用:提供构建系统的基础架构和 API,包括任务调度和依赖管理。

  • 任务依赖管理

  • 作用:管理任务之间的依赖关系,确保任务按照正确的顺序执行。

  • 构建执行

  • 作用:执行构建任务,如编译、测试和打包。

  • Android Gradle Plugin

  • 作用:在 Gradle 框架的基础上,为 Android 项目提供特定的构建任务和 artifacts。

  • 自定义 Plugin

  • 作用:开发者根据项目需求自定义的插件,可以扩展 Android Gradle plugin 的功能或插入自定义任务。

9.2 插件应用案例

Gradle 插件是一组预定义的任务和配置,可以扩展构建的功能。通过应用插件,可以无需编写复杂的任务代码就能实现标准的功能。


plugins {    id 'java'    id 'com.android.application' version '7.0.0'}
复制代码


其他内容在第二篇文章《高效开发 Gradle 架构设计图解/掌握项目工程自动化技巧(精通篇二)》中。。。

发布于: 刚刚阅读数: 6
用户头像

智慧属心窍之锁 2019-05-27 加入

擅长于通信协议、微服务架构、框架设计、消息队列、服务治理、PAAS、SAAS、ACE\ACP、大模型

评论

发布
暂无评论
高效开发Gradle架构设计图解/掌握项目工程自动化技巧(精通篇一)_Java_肖哥弹架构_InfoQ写作社区