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详解:
- 地址:Gradle学习笔记
工程化之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知识概括的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Boot“bootRun”启动的应用程序在包含 Gradle Vaadin 插件时会导致 NoClassDefFoundError