Gradle
1.Gradle安装
下载:https://gradle.org/releases/
配置环境变量:
vim .bash_profile
export GRADLE_HOME=/Users/zt/work/software/gradle-7.4.2 export PATH=$PATH:$GRADLE_HOME/bin
重新加载环境变量:source .bash_profile
验证:gradle -v
gradle目录结构介绍:
bin目录:命令
caches:jar默认地址
其他:自身运行环境,使用的时候基本不用关心
2.IDEA中使用Gradle
-
idea配置gradle
-
创建工程
3.Gradle目录结构介绍
-
标准项目结构
src/main/java:正式源代码
src/mian/resources:主要资源文件
src/test/java:测试相关代码
src/test/resources:测试相关资源文件
build.gradle:相当于pom.xml
-
项目打包
4.Gradle相关文件介绍
-
build.gradle构建脚本介绍
gradle构建脚本中最重要的2个概念是project和task,任何一个gradle构建都由一个或者多个project组成,每个project包括许多构建部分,可以是一个jar也可以是一个web应用等
每个工程都对应一个build.gradle构建脚本
-
Project对象
一个project代表一个正在构建的组件(jar/war文件),当构建开始时,Gradle会基于build.gradle实例化一个org.gradle.api.Project对象,对象名称为project,通过project变量来隐式调用其他成员(使用groovy语法)
Project属性:
-
设置仓库位置
Gradle没有自己的中央仓库 ,使用的是maven的中央仓库
在环境变量中设置:export GRADELE_USER_HOME=/Users/zt/work/software/repo
在idea中设置gradle目录:
在build.gradle中的内容:
repositories { /* * 指定仓库位置:默认情况下使用的是中央仓库,项目如果需要下载jar包从中央残酷下载到本地目录(gradle-7.4.2/caches/modules-2/files-2.1) * 使用本地maven仓库:下载后的内容在repo/caches/modules-2/files-2.1中 */ mavenLocal() mavenCentral() }
-
Task
任务的定义方式:
//定义任务方式1 task(t1, { //配置代码 println "我是任务1" //动作代码 doFirst { println "在任务t1执行前操作的动作代码" } //动作代码 doLast { println "在任务t1执行后操作的动作代码" } }) //定义任务方式2,放在自定义分组下 task(t2,{ group("mytask") //配置代码 println "我是任务2" //动作代码 doFirst { println "在任务t2执行前操作的动作代码" } //动作代码 doLast { println "在任务t2执行后操作的动作代码" } }) //定义任务方式3 tasks.create("t3"){ group("mytask") //配置代码 println "我是任务3" } //定义任务方式4 tasks.register("t4"){ group("mytask") //配置代码 println "我是任务4" } //定义任务方式5 tasks{ task t5{ group("mytask") //配置代码 println "我是任务5" } } //定义任务方式6,可以一次性定义多个任务>>动态任务定义 3.times{index -> task("task${index}"){ group("mytask") //配置代码 println "task${index}" } }
定义好的任务默认在other分组下,可以通过group()来自定义任务分组
任务的依赖:
task a{ group("mytask") doFirst { println "我是任务a" } } task b(dependsOn:a){ group("mytask") doFirst { println "我是任务b" } } task c{ group("mytask") dependsOn "b" doFirst { println "我是任务c" } } task d{ group("mytask") doFirst { println "我是任务d" } } d.dependsOn c
定任任务:对某个已有的任务进行扩展,例如对clean内置任务进行扩展
clean.doLast { println "我在clean之后执行这个逻辑" } tasks.named('clean').get().doFirst { println "我在clean之后执行这个逻辑" }
Gradle项目构建生命周期:
Gradle的生命周期分为三个阶段:初始化阶段,配置阶段,执行阶段
初始化阶段:通过settings.gradle判断有哪些项目需要初始化,加载所有需要初始化的项目的build.gradle文件并为每个项目创建project对象
配置阶段:执行各项目下的build.gradle脚本,完成project的配置,并且构造task任务依赖关系图
执行阶段:通过配置阶段的task依赖图,按顺序执行需要执行的任务中的动作代码,就是在执行任务中写在doFirst或doLast中的代码
通过tasks.register定义的任务,在build阶段的配置过程中不执行
通过tasks.register定义的任务,在任务的执行阶段的配置过程中执行配置代码
通过tasks.register定义的任务,配置代码的执行时机是落后于用task方式配置的
(ps:可以吧一个任务理解为有3个生命周期,其中配置阶段执行除tasks.register定义的任务外所有任务的配置代码,在执行阶段只执行当前任务的动作代码)
5.多项目构建
在企业中一个复杂的项目往往是分成几个小项目来协同完成的,这就涉及到多项目的构建,而多项目构建则需要把一个大项目进行项目模块化,通过模块的互助协作完成整个功能。在之前使用maven的多项目构建时,一般需要一个root项目来统一管理所有的模块,gradle也一样使用一个root来统一管理所有的模块
![image-20220610230841844](/Users/zt/Library/Application Support/typora-user-images/image-20220610230841844.png)
![image-20220610230914707](/Users/zt/Library/Application Support/typora-user-images/image-20220610230914707.png)
配置:
统一插件配置在根项目的build.gradle中配置
allprojects { //写法1 plugins { id 'java' } //写法2 apply plugin: 'java' }
统一配置公共属性
allprojects { project.group='com.zt' project.version='1.0.0' }
配置项目的依赖关系,在子项目的build.gradle中配置
dependencies { compile project('') }
统一资源库配置
subprojects { repositories { mavenLocal() mavenCentral() } }
配置公用的依赖在根项目的build.gradle中
subprojects { dependencies { testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' implementation group: 'com.alibaba', name: 'fastjson', version: '1.2.83' } }
PS:如果配置在subprojects外面,就只针对根生效,对子项目无效