当前位置:网站首页>Gradle知识概括
Gradle知识概括
2022-07-06 15:50:00 【GeorgeLin98】
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的区别
边栏推荐
- What does front-end processor mean? What is the main function? What is the difference with fortress machine?
- mysql连接vscode成功了,但是报这个错
- 让 Rust 库更优美的几个建议!你学会了吗?
- Modules that can be used by both the electron main process and the rendering process
- The statement that allows full table scanning does not seem to take effect set odps sql. allow. fullscan=true; I
- Efficient ETL Testing
- 公链与私链在数据隐私和吞吐量上的竞争
- Detailed explanation of regular expression (regexp) in MySQL
- Two week selection of tdengine community issues | phase II
- With the help of this treasure artifact, I became the whole stack
猜你喜欢
koa2对Json数组增删改查
B 站弹幕 protobuf 协议还原分析
Cocoscreator+typescripts write an object pool by themselves
Dayu200 experience officer homepage AITO video & Canvas drawing dashboard (ETS)
Detailed explanation of regular expression (regexp) in MySQL
DockerMySQL无法被宿主机访问的问题解决
MySQL implementation of field segmentation from one line to multiple lines of example code
Les entreprises ne veulent pas remplacer un système vieux de dix ans
机器人材料整理中的套-假-大-空话
asp读取oracle数据库问题
随机推荐
让我们,从头到尾,通透网络I/O模型
吴恩达2022机器学习课程评测来了!
JS import excel & Export Excel
AI金榜题名时,MLPerf榜单的份量究竟有多重?
Automatically update selenium driver chromedriver
食品里的添加剂品种越多,越不安全吗?
GPT-3当一作自己研究自己,已投稿,在线蹲一个同行评议
浅谈现在的弊端与未来的发展
面试题:AOF重写机制,redis面试必问!!!
Graphite document: four countermeasures to solve the problem of enterprise document information security
Example code of MySQL split string as query condition
同一个作业有两个source,同一链接不同数据库账号,为何第二个链接查出来的数据库列表是第一个账号的
Cocoscreator+typescripts write an object pool by themselves
监控界的最强王者,没有之一!
Method of canceling automatic watermarking of uploaded pictures by CSDN
Word2vec (skip gram and cbow) - pytorch
石墨文档:4大对策解决企业文件信息安全问题
Realize colorful lines and shape your heart
[launched in the whole network] redis series 3: high availability of master-slave architecture
(flutter2) as import old project error: inheritfromwidgetofexacttype