Gradle知识概括

Posted GeorgeLin98

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gradle知识概括相关的知识,希望对你有一定的参考价值。

Gradle知识概括

Gradle简介

Gradle背景:

  • 早期没有项目管理工具时,对于项目所依赖的第三方包采用的事:拷贝三方jar包到本地,然后加入到lib目录下,这样做劣势不言而喻,管理复杂容易冲突。
  • Ant:2000年发布,纯java编写
  • Maven:2004年发布,采用pom.xml管理项目
  • Gradle:2012年,google背书的一款项目管理工具

Gradle简介:

  • Gradle是一种开源自动化构建工具,支持多语言环境,受Ant、Maven思想的影响,集二者之大成,相比Ant的不规范,Maven的配置复杂、生命周期限制较多,Gradle既规范也更灵活,可以使用DSL(领域特定语言,如Groovy)编写构建,脚本更加精悍。本课程基于Gradle7讲解。
  • 优势:
    ①灵活性:相对于 Maven、Ant 等构建工具,Gradle 提供了一系列的 API 让我们有能力去修改或定制项目的构建过程。
    ②粒度性:源码的编译,资源的编译,都是一个一个Task的,我们可以修改task来达到精细控制上。
    ③扩展性:Gradle 支持插件机制,所以我们可以复用这些插件,就如同复用库一样简单方便。
    ④兼容性:Gradle 不仅自身功能强大,而且它还能兼容所有的Maven、Ant功能,也就是说,Gradle 吸取了所有构建工具的长处。
    ⑤Spring源码采用Gradle进行管理
  • 劣势:
    ①每一个版本都较上一次有非常大的改动,没有做较好向上兼容。
    ②学习成本高,groovy脚本语言
  • Gradle组成:

Gradle安装配置:

  • 地址:官网下载
  • 下载后解压到本地:
    ①binary-only版本(-bin后缀):只有可执行文件
    ②complete版本(-all后缀):除了可执行文件还包含Gradle的源码和源码文档说明
  • 下载后解压,配置环境变量:
    ①新建GRADLE_HOME环境变量,将gradle根目录配置
    ②在path中加入项%GRADLE_HOME%\\bin,类似于JDK或Maven的配置
    ③打开CMD,执行gradle -v,成功输出版本则表示安装配置完成
  • 注意:真实工作中由于各项目版本不一,并不会使用本地配置的gradle,而是采用wrapper的方式进行。

Gradle详解:

  • Gradle中2大对象:Project和Task。
    ①一个构件脚本就是一个project,任何一个Gradle构建都是由一个或多个project组成,大家可以把一个project比作一个pom模块或一个jar,每一个project都是一个groovy脚本文件。
    ②task顾名思义就是任务,它是Gradle中最小的执行单元,类似于一个method或function函数,如编译、打包、生成javadoc等,一个project中会有多个tasks。

Gradle构建Web

创建Gradle项目:

  • 手动创建:
    ①执行gradle init创建项目
  • 快速搭建(https://start.spring.io/):
    ①Gradle版的SpringBoot
    ②Maven版的SpringBoot

项目结构解析:

├─build.gradle                        ①
├─gradlew                             ②
├─gradlew.bat						  ③
├─settings.gradle                     ④
├─gradle                              ⑤
│  └─wrapper                          
│      ├─ gradle-wrapper.jar          
│      ├─ gradle-wrapper.properties   
└─src                                 ⑥
    ├─main                            
    └─test
  • 1.项目自动编译的时候要读取的配置文件。比如指定项目的依赖包等。build.grade有两个,一个是全局的,一个是在模块里面。全局的build.grade主要设置的是声明仓库源,gradle的版本号说明等。
  • 2.linux下的gradle环境脚本,可以执行gradle指令,如:./gradlew build。
  • 3.windows下的gradle环境,可以执行gradle指令。
  • 4.包含必要的一些设置,例如,任务或项目之间的依懒关系等,无论有多少个子模块,该文件只会有一个,且一定在根项目中。
  • 5.包含wrapper文件夹及其2个子文件,作用是:可以自动安装gradle环境。
  • 6.程序源码。

build.gradle基础结构:

/******** 普通程序 gradle init初始化 ******/
plugins 
    // Apply the java plugin to add support for Java
    id 'java'
    ...

repositories 
    // Use jcenter for resolving dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()

dependencies 
    implementation 'com.google.guava:guava:27.1-jre'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.2'

application 
    mainClassName = 'first.init.App'

test 
    useJUnitPlatform()


/******** SpringBoot 项目基础配置 ******/
plugins 
	id 'org.springframework.boot' version '2.6.4'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'


group = 'com.it235'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories 
	mavenCentral()


dependencies 
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'


tasks.named('test') 
	useJUnitPlatform()

  • mavenCentral()和jCenter()区别:
    ①mavenCentral:Maven中央仓库,http://repo1.maven.org/maven2/,由Sonatype公司提供的服务。它是Apache Maven、SBT和其他构建系统的默认仓库,并能很容易被Apache Ant/Ivy、Gradle和其他工具所使用。开源组织例如Apache软件基金会、Eclipse基金会、JBoss和很多个人开源项目都将构件发布到中央仓库。 maven中央仓库已经将内容浏览功能禁掉了,可在http://search.maven.org/查询构件。
    ②jCenter:是由JFrog公司提供的Bintray中的Java仓库。它是当前世界上最大的Java和android开源软件构件仓库。 所有内容都通过内容分发网络(CDN)使用加密https连接获取。JCenter是Goovy Grape内的默认仓库,Gradle内建支持(jcenter()仓库),非常易于在(可能除了Maven之外的)其他构建工具内进行配置。
    JCenter相比mavenCenter构件更多,性能也更好。但还是有些构件仅存在mavenCenter中。

IDE使用Gradle:

  • Settings—》Gradle可以配置gradle_home,但是如果你配置了后续使用会趟不少坑,因为IDEA会默认使用gradle-wrapper的下载内容,这里我们先讲常规配置,如下图:

  • 但当你导入项目时会发现,程序会下载一个wrapper相关的zip包:
  • 为什么会这样呢?跟maven好像不太一样,这个Wrapper的作用又是什么?
    ①Gradle-Wrapper是简化Gardle的安装和部署,出发点是让任意的gradle的项目都不需要单独安装环境,项目会自动识别有无环境,如果在本地没有找到与wrapper.properties版本相同的Gardle,IDEA就会帮你下载一个gradle环境,官方的出发点是好的,下面我们来了解下这些配置的意义。
# distributionBase和distributionPath是配合使用,指定gradle解压后的存放位置
# GRADLE_USER_HOME表示用户目录,
	# windows系统:c:\\window\\<user-name>\\.gradle\\
	# linux是$HOME/.gradle
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists

# 指定某个版本gradle下载地址
distributionUrl=https\\://services.gradle.org/distributions/gradle-7.4.1-bin.zip

# zipStoreBase和zipStorePath配合使用,指定下载gradle.zip存放位置;
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

Groovy语法基础

Groovy简介:

  • Groovy 是一种基于 JVM 的动态语言,他的语法和 Java 相似,最终也是要编译 .class 在JVM上运行。Groovy完全兼容Java 并且在此基础上添加了很多动态类型和灵活的特性,比如支持闭包,支持DSL(领域特定语言),是一门非常灵活的动态脚本语言。
  • 要执行groovy的脚本必须要安装groovy环境,或者使用Java的ClassLoader来调用。
  • 地址:Groovy环境安装下载链接
  • 推荐下载3.0版本,下载后建议放到C盘的C:\\Program Files\\groovy\\目录下,并配置GROOVY_HOME和Path即可

Groovy详解:

工程化之Project

Project简介:

  • 在gradle中,每一个build.gradle文件对应一个Project实例,我们在build.gradle中编写的内容,就相当于Project实例的属性或方法。
  • 构建初始化期间,Gradle实例化的步骤如下:
    ①给整个构建创建一个Settings实例,一个Settings实例就是一个settings.gradle文件
    ②针对Settings实例的配置,按配置层次扫描并解析配置在settings.gradle中的project。(其中settings中最为重要的属性是include)
    ③针对每个project对应的build.gradle进行初始,并创建Project实例(这里加载project的顺序是按照前面的配置层次进行,即广度扫描加载,这样可以保证父级模块加载完后,子模块才会被加载)
  • 一个完整的project由以下几个对象组成(实际上只由属性和方法组成):

属性:

  • 内置属性可以直接赋值,无需声明:
group = 'com.it235'
version = '1.0.0'
  • 自定义属性可以使用groovy语法,也可以与java语法结合:
//groovy定义属性
def pname = "projectName:" + project.name

//java类型接收
String pname = "projectName:" + project.name
  • 使用ext名命空间来扩展属性,定义后可以在project、task、subproject中读取和更新:
ext.prop1 = "it"
ext.prop2 = "编程"
  • 属性作用域:
    ①读写属性时,Project 会按照下面范围的顺序进行查找的,在某个范围找到属性后就会返回该属性。如果没有找到,会抛出异常。
    <1>Project 对象自身。这个范围里的属性包含 Project 实现类中定义有 getters 和 setters 方法的所有属性。比如:project.getName() 方法就对应了 name 属性。至于这些属性的可读写性取决于它们是否定义 getters 或者setters 方法。
    <2>Project 的ext属性 ( extra ) 。每个 Project 都会维护一个额外属性的映射,它可以包含任意的名称 -> 值对。定义后,此作用域的属性是可读写的。比如:project.ext.prop1 = ‘it’ 。
    <3>通过插件被添加到 Project 中的扩展属性 ( extensions ) 。每个扩展名都可以作为只读属性使用,其名称与扩展名相同。比如:project.android.compileSdkVersion 。
    <4>通过插件添加到 Project 中的约定属性 ( convention ) 。插件可以通过 Project 的 Convention 对象向 Project 中添加属性和方法。此范围的属性的可读可写性取决于约束对象。
    <5>Project 中 Tasks 。可以使用 Task 的名称作为属性名称来访问task。此范围的属性是只读的。
    <6>ext的属性和约定属性从项目的父级继承,递归到根项目。此范围的属性是只读的。
  • 常用的project属性:
属性名描述
allprojects包含此项目及其子项目的集合。
buildDir当前项目的编译目录(自动生成)默认值 porjectDir/build
defaultTasks当前项目的默认任务的名字集,当前构建没有提供任务名时会执行这些默认任务
group当前项目的组名
logger当前项目的日志器,可以用来在 build 文件中写日志
name此项目的名称
parent此项目的父项目
path这个项目的绝对路径
project当前project对象实例
rootDir本项目的根目录。根目录是根项目的项目目录
rootProject当前项目层次结构中的根project
subprojects当前项目的子项目的集合
tasks本项目的task集合。
version此项目的版本

方法:

  • 方法作用域:
    ①Project 对象自身
    ②build.gradle 脚本文件
    ③通过插件添加到 Project 中的扩展 ( extensions ) 。每个扩展都可以当做参数是闭包或 Action 的方法。
    ④插件添加到项目中的约定方法 ( convention ) 。插件可以通过项目的 Convention 对象向项目中添加属性和方法。
    ⑤项目中的 Tasks 。每个 Task 都会添加一个方法,方法名是任务名,参数是单个闭包或者 Action 。该方法使用提供的闭包为相关任务调用 Task.configure( groovy.lang.Closure ) 方法。
  • 常用的Project方法:
方法描述
afterEvaluate可以添加一个闭包,它会在项目完成评估后立即执行。当执行属于该项目的构建文件时,会通知此类监听器。
allprojects配置当前项目以及它的每个子项目
apply应用零个或多个插件或脚本。
beforeEvaluate添加一个闭包,它会在项目开始评估前立即执行
configure通过闭包配置对象集合。
copy复制指定的文件
defaultTasks设置此项目的默认任务的名称。当开始构建时没有提供任务名称时使用这些。
delete删除文件和目录
exec执行外部命令
file解析相对于该项目的项目目录的文件路径
findProject按路径定位项目。如果路径是相对的,则相对于该项目进行解释。
findProperty找特定属性,如果未找到,则返回给定属性的值或 null
getAllTasks返回此项目中包含的任务的地图
hasProperty确定此项目是否具有给定的属性
javaexec执行 Java 主类
javaexec执行外部 Java 进程。
mkdir创建一个目录并返回一个指向它的文件。
property返回给定属性的值。此方法定位属性如下:
setProperty设置此项目的属性。此方法在以下位置搜索具有给定名称的属性,并将该属性设置在它找到该属性的第一个位置。
subprojects配置本项目的子项目
task创建Task具有给定名称的 a 并将其添加到此项目中
uri将文件路径解析为 URI,相对于该项目的项目目录
  • 常用方法示例:
    ①buildscript:配置当前gradle脚本自身需要使用的构建信息或依赖
    ②configurations:配置使用声明的依赖项用于特定目的
    ③repositories:仓库配置
    ④dependencies:在gradle中dependencies是一等公民,它描述了configurations中分组依赖的第三方资源。
    ⑤allprojects:配置此项目及其每个子项目所需要的依赖。一般在多模块项目场景下我们会把公共的部分配置在根项目的allprojects中。
    ⑥subprojects:子模块配置
    ⑦sourceSets:配置源码信息
    ⑧artifacts:配置需要交付的产品组件信息
    ⑨publishing:deploy当前项目到仓库

工程化之任务

任务简介:

  • 任务是gradle的最小执行单元,一个build.gradle是由一系列的task组成,重要性不言而喻。

工程化之插件

插件简介:

  • 插件可以封装一系列任务,例如 编译,测试,打包等。IDEA、VsCode、Eclipse、Maven、Chrome等都是支持插件集成的工具。插件意味着扩展,Gradle只要定义好插件规范,各大厂商或个人开发者遵循这个规范就能开发出很多有用的插件,从而丰富Gradle生态。
  • 现如今使用评率非常高的几款插件:SpringBoot构建插件,Docker容器集成插件,junit单元测试插件等

工程化之生命周期

生命周期:

  • Gradle的核心是一种基于依赖的编程语言,任务与任务之间有一定的依赖关系,并且每个任务只会执行一次。在构建时,Gradle会把这些任务串联起来形成有向无环图。那Gradle是在什么时候进行串联的呢?这就需要充分了解Gradle在各个阶段做了什么事情了,从一开始到结束的这一连串动作我们称为生命周期。
  • gradle构建有3个不同的阶段:
    ①初始化: gradle支持单项目和多项目构建,在该阶段,gradle会解析setting.gradle文件,确定哪些项目需要参与构建,并且为这些项目创建一个Project实例。
    ②配置:当完成初始化阶段后,就会进入配置阶段,配置阶段解析所有project中的build.gradle文件获取所有的task,形成有向无环图后执行依赖关系,并且所有project中的build script部分和task的配置段会在这一阶段调用(注意并不是执行具体的task代码)。
    ③执行task: 当完成任务依赖图后, Gradle 就做好了一切准备,然后进入执行阶段。按照有向无环图中task列表的顺序,执行所有被指定的task。

总结

完整的build.gradle:

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: "war"
//声明
apply plugin: "com.jfrog.bintray"
apply plugin: 'org.akhikhl.gretty' //gradle + jetty 服务器tomcat

/**
 * buildscript  是构建工具Gradle自身所需要的资源,并不是给我们应用所使用,可以声明maven库和插件依赖
 * 如:这个区块里包含gradle-plugin的依赖,因为这个插件包含了Gradle构建APP模块所需要的附加命令。 
 */
buildscript 
    /**
     * repositories  区域配置Gradle用来下载依赖的仓库地址。
     * Gradle内置支持的远程仓库有JCenter、Maven Central 和 Ivy,4.1版本开始内置支持google()。 
     * 也可以使用本地仓库或者配置我们自己的远程仓库地址。
     * 下面代码示例Gradle使用JCenter作为查找依赖库的代码仓库。
     */
    repositories 
        maven url "https://maven.aliyun.com/repository/public"
        jcenter()
    

    /**
     * dependencies  区域配置了Gradle编译APP工程所需要的依赖。
     * 下面代码展示路径依赖3.1.0版本gradle-plugin
     */
    
	dependencies 
		classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0"
		classpath 'org.akhikhl.gretty:gretty:+'
	


//只允许buildscript 和 pluginManagement在它前面
plugins 
    //核心插件,gradle提供
    id 'java'
    id 'eclipse'
    id 'war'
    //非核心插件(社区插件),必须通过id+version的方式进行约束
    id 'com.bmuschko.docker-remote-api' version '6.7.0'
    id 'com.jfrog.bintray' version '1.8.5'


//gav 坐标
group 'com.it235'
version '1.0.0'

sourceCompatibility = 1.8
targetCompatibility = 1.8

/**
 * allprojects  区域可以配置工程中所有模块都用到的代码仓库和依赖,如,三方插件或者库。
 * 如果是一个单体项目可以无需使用allprojects闭包,,直接将repositories写在根节点下
 */
allprojects 
   repositories 
       maven  url 'https://maven.aliyun.com/repository/jcenter' 
	   maven  url 'https://maven.aliyun.com/repository/google' 
	   maven  url 'https://maven.aliyun.com/repository/central' 
	   maven  url 'https://maven.aliyun.com/repository/gradle-plugin' 
	   google()
	   jcenter()
   


/**
 * subprojects  区域可以配置工程中所有子模块所使用的代码仓库和依赖,如,三方插件或者库。
 * 与allprojects相对应,使用场景较少
 */
subprojects 
   repositories 
       jcenter()
   


test
	useJUnitPlatform()


task cleanx() 
	println "Hello Gradle"
	//Groovy语法,Gradle正真强大的地方,太灵活,所以上手的成本非常高,这也是为什么别人说比Maven好的地方,Maven XML扩展能力太差了


Gradle目录与Idea配置:

  • Use Gradle from使用此列表为您的项目配置Gradle版本(配置Gradle工作目录)。您可以选择以下选项之一:
    ’gradle-wrapper.properties’ file:这是使用Gradle包装器的推荐默认选项。在这种情况下,您可以将Gradle版本的更新委派给Gradle并自动下载该版本的Gradle。 此选项还允许您使用精确的Gradle版本进行构建。 Gradle版本保存在项目的gradle目录中的gradle-wrapper.properties文件中,可帮助您消除任何Gradle版本问题。
    ’wrapper’ task in Gradle build script:选择此选项可根据包装器任务配置来配置Gradle包装器。 如果您希望控制在项目中使用哪个Gradle版本,可能会很方便。如果使用默认的Gradle包装器选项,然后切换到Gradle包装器任务配置,则您在任务中所做的更改将在项目导入期间自动更新。
    Specified location:如果您不想使用Gradle包装器,而是希望手动下载并使用特定的Gradle版本,请选择此选项。 指定您的Gradle安装位置。
  • 配置Gradle用户家目录:Gradle默认使用C:\\Users\\Administrator.gradle作为Gradle仓库目录用于存储全局配置属性和初始化脚本以及缓存和日志文件。
    ①一般来说不配置在C盘,因此可以在Idea中通过Gradle User Home额外指定配置在其他盘。可以新建一个目录也可以指定为Maven的本地目录。
  • 正确配置IDEA使得在Terminal中执行以gradlew(gradle wrapper)开头命令和操作图形化的IDEA使用Gradle版本是同一个版本。
    ①GRADLE_USER_HOME指的是你需要配置的环境变量。该环境变量决定了执行 project/gradle/gradle-rapper.jar时下载 project/gradle/gradle-wrapper.properties中指定版本gradle的存放位置。在命令行中输入的以gradlew的开头的命令会使用GRADLE_USER_HOME指定环境变量所在位置来存放下载的gradle。
    ②Gradle user home指的是IDEA中关于gradle的配置,该配置指是给IDEA使用的,当你在IDEA中点击gradle相关的图形按钮时,譬如gradle构建任务的按钮或者是Enable-AutoImport按钮时会使用Gradle user home指定的目录下载project/gradle/gradle-wrapper.properties指定的gradle版本。
  • 链接:IDEA如何正确配置Gradle? GRADLE_USER_HOME 和 Gradle user home的区别

以上是关于Gradle知识概括的主要内容,如果未能解决你的问题,请参考以下文章

Gradle知识概括

Gradle基础知识点总结

Gradle目录结构

R语言基础知识详解及概括

使用 Spring Boot“bootRun”启动的应用程序在包含 Gradle Vaadin 插件时会导致 NoClassDefFoundError

SpringCloud知识概括