高效开发Gradle架构设计图解/掌握项目工程自动化技巧

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

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

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的继承与发展:

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

  1. 对XML配置的改进:

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

  1. 灵活性和可扩展性的需求:

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

  1. 性能优化:

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

  1. 多语言项目的支持:

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

  1. 社区的推动:

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

  1. 与现有工具的兼容性:

尽管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. 构建速度:

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

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

  1. 灵活性和配置:

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

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

  1. 依赖管理:

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

  1. 插件生态:

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

  1. 构建缓存:

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

  1. 增量构建:

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

  1. 守护进程机制:

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

  1. 易于扩展:

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

  1. 集成与兼容性:

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

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

5、Gradle的内部结构

图片图片

Gradle架构组件解释:

  1. 核心自动化平台:

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

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

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

  1. 软件开发平台:

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

  1. JVM平台:

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

  1. 扩展性平台:

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

  1. 本地平台:

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

  1. 企业模块:

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

6、Gradle框架设计

图片图片

Gradle架构组件解释:

  • 构建系统:Gradle的整体构建系统。
  • 核心自动化:Gradle的核心功能,包括构建配置、依赖管理、插件应用和任务执行。
  • 构建配置:负责项目的构建配置。
  • 依赖管理:处理项目的依赖关系。
  • 插件应用:允许通过插件扩展Gradle的功能。
  • 任务执行:执行定义好的构建任务。
  • 多项目管理:支持多模块和多项目的构建。
  • 子项目构建:能够独立构建每个子项目。
  • 构建缓存:通过构建缓存提高构建速度。
  • 并行执行:支持任务的并行执行,进一步提升构建速度。
  • 与Maven兼容:能够导入Maven项目,保持与Maven的兼容性。

7、Gradle执行流程图

图片图片

Gradle执行流程解释:

  1. 初始化阶段(Initialization) :

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

  1. 配置阶段(Configuration) :

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

  1. 执行阶段(Execution) :

在执行阶段,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. 插件应用:

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

  1. 依赖配置:

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

  1. 任务定义:

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

  1. 构建逻辑:

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

  1. 源代码和资源配置:
  • 配置源代码目录和资源文件,指定哪些文件应该被包含在构建中。
  1. 构建版本管理:

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

  1. 编译选项:

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

  1. 测试配置:

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

  1. 打包和发布:

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

  1. 多项目构建:

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

  1. 自定义构建行为:

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

  1. 环境配置:

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

  1. 报告和文档生成:

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

  1. 质量控制:

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

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

9.1 插件应用

Gradle插件设计架构

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

  1. 底层Gradle框架:

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

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

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

  1. 开发者自定义Plugin:

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

Gradle插件的构建过程

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

  1. 插件源代码编译:

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

  1. 插件JAR包打包:

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

  1. 插件元数据生成:

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

  1. 插件发布:

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

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'
}

责任编辑:武晓燕 来源: Solomon肖哥弹架构
相关推荐

2024-10-06 13:05:43

2013-05-02 13:02:59

开发环境自动化团队

2024-06-17 10:34:12

2011-04-08 17:03:19

Java架构

2023-02-22 08:12:30

KafkaSender 线程

2024-03-20 13:19:53

2011-07-21 15:07:59

SQL Server数自动化管理分区

2022-03-29 15:10:22

架构设计模型

2023-09-13 11:40:12

2022-07-06 11:20:16

前端开发

2020-07-24 09:52:55

自动化ITCIO

2020-02-27 10:11:11

自动化IT安全

2023-08-29 15:17:40

Docker容器架构

2021-11-26 14:59:02

异常检测网络攻击网络威胁

2009-07-06 10:36:41

敏捷开发

2017-12-17 21:58:18

2010-02-06 13:46:55

Android开发

2013-11-27 11:34:43

自动化部署Python

2023-11-20 22:07:51

PythonPDF

2018-07-26 13:50:37

IT架构运维
点赞
收藏

51CTO技术栈公众号