前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Gradle入门基础一

Gradle入门基础一

作者头像
@派大星
发布2023-06-28 15:00:24
发布2023-06-28 15:00:24
24500
代码可运行
举报
文章被收录于专栏:码上遇见你码上遇见你
运行总次数:0
代码可运行

最近项目中使用到了Gradle所以就抓紧学习了一下。以下资料来自互联网,属于个人整理。图片如有侵权会删除

Gradle生命周期

代码语言:javascript
代码运行次数:0
运行
复制
Initialization、Configuration、Execution

具体职责如下:

  • Initialization 阶段主要目的是初始化构建, 它又分为两个子过程,一个是执行 Init Script,另一个是执行 Setting Script。
  • init.gradle文件会在每个项目 build 之前被调用,用于做一些初始化的操作,它主要有如下作用:
    • 配置内部的仓库信息(如公司的 maven 仓库信息);
    • 配置一些全局属性;
    • 配置用户名及密码信息(如公司仓库的用户名和密码信息)。
  • Setting Script 则更重要, 它初始化了一次构建所参与的所有模块。
  • Configuration 阶段:这个阶段开始加载项目中所有模块的 Build Script。所谓 "加载" 就是执行

build.gradle 中的语句, 根据脚本代码创建对应的 task, 最终根据所有 task 生成由 Task 组成的有向无环图(Directed Acyclic Graphs),如下:

从而构成如下有向无环树:

  • Execution 阶段:这个阶段会根据上个阶段构建好的有向无环图,按着顺序执行 Task【Action 动作】

Setting文件

主要作用:

  • 主要是在项目初始化阶段确定一下引入哪些工程需要加入到项目构建中,为构建项目工程树做准备。
  • 工程树:gradle 中有工程树的概念,类似于 maven 中的project 与module。

内容:

  • 里面主要定义了当前 gradle 项目及子 project 的项目名称
  • 必须放在根工程目录下,并且有且只有一个settings文件
  • settings.gradle 文件,名字不能发生变化
  • 对应实例:与 org.gradle.api.initialization.Settings 实例是一一对应的关系。每个项目只有一个settings 文件。
  • 作为开发者我们只需要关注该文件中的include 方法即可。使用相对路径【 : 】引入子工程。
  • 一个子工程只有在setting 文件中配置了才会被 gradle 识别,这样在构建的时候才会被包含进去。案例如下所示:
代码语言:javascript
代码运行次数:0
运行
复制
//根工程项目名
rootProject.name = 'root'
//包含的子工程名称 在不引起歧义的情况下可以 () 去掉
include ('subject01') 
// 使用 : 也可以例如下面 :的意思是当前项目目录下的subject02
include ':subject02' 
include 'subject03'
//包含的子工程下的子工程名称
include 'subject01:subproject011' 
include 'subject01:subproject012'

项目名称中 ":" 代表项目的分隔符, 类似路径中的 "/". 如果以 ":" 开头则表示相对于 root project。然后 Gradle 会为每个带有 build.gradle 脚本文件的工程构建一个与之对应的 Project 对象。

Gradle对测试的支持

Junit的使用

Gradle对Junit 4的支持
代码语言:javascript
代码运行次数:0
运行
复制
dependencies {
    testImplementation group: 'junit' ,name: 'junit', version: '4.12'
}
// test {
//     useJUnit()
// }
Gradle对Junit 5的支持
代码语言:javascript
代码运行次数:0
运行
复制
dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' 
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
    // 支持Junit 5测试
    useJUnitPlatform()
}

包含和排除特定测试

代码语言:javascript
代码运行次数:0
运行
复制
test {
    // 跳过测试
    enabled false 
    useJUnit() 
    
    include 'com/**'
    exclude 'com/abc/**'
}

Task

目实质上是 Task 对象的集合。一个 Task 表示一个逻辑上较为独立的执行过程,比如编译Java 源代码,拷贝文件, 打包Jar 文件,甚至可以是执行一个系统命令。另外,一个 Task 可以读取和设置Project 的Property 以完成特定的操作。

官方文档:https://docs.gradle.org/current/userguide/tutorial_using_tasks.html

demo:

代码语言:javascript
代码运行次数:0
运行
复制
task A {
    // 任务的配置段,在配置阶段执行
    println "root taskA" 
    // 任务的行为:在执行阶段执行,doFirst会在doLast之前执行
    doFirst(){
        println "root taskA doFirst"
    }
    doLast(){
        println "root taskA doLast"
    }
}

如何区分任务的配置段和任务的行为:

任务的配置段在配置阶段执行,任务的行为在执行阶段执行

任务的行为

代码语言:javascript
代码运行次数:0
运行
复制
def map=new HashMap<String,Object>();
//action属性可以设置为闭包,设置task自身的行为
map.put("action",{println "taskD.."})
task(map,"a"){
    description   'taskA description '
    group "atguigu"
    //在task内部定义doFirst、doLast行为
    doFirst {
        def name = 'doFirst..' 
        println name
    }
    doLast {
        def name = 'doLast..' 
        println name
    }
}
//在task外部定义doFirst、doLast行为
a.doFirst {
    println it.description
}
a.doLast {
    println it.group
}
底层原理分析

无论是定义任务自身的 action,还是添加的doLast、doFirst 方法,其实底层都被放入到一个Action 的List 中了,最初这个 action List 是空的,当我们设置了 action【任务自身的行为】,它先将action 添加到列表中,此时列表中只有一个action,后续执行doFirst 的时候doFirst 在action 前面添加,执行 doLast 的时候doLast 在action 后面添加。doFirst 永远添加在actions List 的第一位,保证添加的Action 在现有的 action List 元素的最前面;doLast 永远都是在action List 末尾添加,保证其添加的Action 在现有的action List 元素的最后面。一个往前面添加,一个往后面添加,最后这个action List 就按顺序形成了doFirst、doSelf、doLast 三部分的 Actions,就达到 doFirst、doSelf、doLast 三部分的 Actions 顺序执行的目的。

提示 1:其中<<代表doLast,在gradle5.x 版本之后就废弃,不能使用了,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
task hello << {
    println 'Hello world!'
}

常用命令

分类

解释

常见的任务(*)

gradle build: 构建项目:编译、测试、打包等操作gradle run :运行一个服务,需要application 插件支持,并且指定了主启动类才能运行gradle clean: 请求当前项目的 build 目录gradle init : 初始化 gradle 项目使用gradle wrapper:生成wrapper 文件夹的。gradle wrapper 升级wrapper 版本号:gradle wrapper --gradle-version=4.4``gradle wrapper --gradle-version 5.2.1 --distribution-type all :关联源码用

项目报告相关任务

gradle projects : 列出所选项目及子项目列表,以层次结构的形式显示gradle tasks: 列出所选项目【当前 project,不包含父、子】的已分配给任务组的那些任务。gradle tasks --all :列出所选项目的所有任务。gradle tasks --group="build setup":列出所选项目中指定分组中的任务。gradle help --task someTask :显示某个任务的详细信息gradle dependencies :查看整个项目的依赖信息,以依赖树的方式显示gradle properties 列出所选项目的属性列表

调试相关选项

-h,--help: 查看帮助信息-v, --version:打印 Gradle、 Groovy、 Ant、 JVM 和操作系统版本信息。-S, --full-stacktrace:打印出所有异常的完整(非常详细)堆栈跟踪信息。-s,--stacktrace: 打印出用户异常的堆栈跟踪(例如编译错误)。-Dorg.gradle.daemon.debug=true: 调试 Gradle 守护进程。-Dorg.gradle.debug=true:调试 Gradle 客户端(非 daemon)进程。-Dorg.gradle.debug.port=(port number):指定启用调试时要侦听的端口号。默认值为 5005。

性能选项:【备注: 在gradle.properties 中指定这些选项中的许多选项,因此不需要命令行标志】

--build-cache, --no-build-cache:尝试重用先前版本的输出。默认关闭(off)。--max-workers: 设置 Gradle 可以使用的woker 数。默认值是处理器数。-parallel, --no-parallel: 并行执行项目。有关此选项的限制,请参阅并行项目执行。默认设置为关闭(off)

守护进程选项

--daemon, --no-daemon: 使用 Gradle 守护进程运行构建。默认是on--foreground:在前台进程中启动 Gradle 守护进程。-Dorg.gradle.daemon.idletimeout=(number of milliseconds):Gradle Daemon 将在这个空闲时间的毫秒数之后停止自己。默认值为 10800000(3 小时)。

日志选项

-Dorg.gradle.logging.level=(quiet,warn,lifecycle,info,debug):通过 Gradle 属性设置日志记录级别。-q, --quiet: 只能记录错误信息-w, --warn: 设置日志级别为 warn-i, --info: 将日志级别设置为 info-d, --debug:登录调试模式(包括正常的堆栈跟踪)

其它(*)

-x:-x 等价于: --exclude-task : 常见gradle -x test clean build--rerun-tasks: 强制执行任务,忽略up-to-date ,常见gradle build --rerun-tasks--continue: 忽略前面失败的任务,继续执行,而不是在遇到第一个失败时立即停止执行。每个遇到的故障都将在构建结束时报告,常见:gradle build --continue。gradle init --type pom :将maven 项目转换为gradle 项目(根目录执行)gradle [taskName] :执行自定义任务

...

代码语言:javascript
代码运行次数:0
运行
复制
gradle.properties

详细命令可参考官方文档:https://docs.gradle.org/current/userguide/command_line_interface.html

拓展:

gradle 任务名是缩写: 任务名支持驼峰式命名风格的任务名缩写,如:connectTask 简写为:cT,执行任务 gradle cT。

前面提到的Gradle 指令本质:一个个的task[任务], Gradle 中所有操作都是基于任务完成的。

gradle 默认各指令之间相互的依赖关系:

图中相关命令的解释:

task的定义方式

  • 一种是通过 Project 中的task()方法,另一种是通过tasks 对象的 create 或者register 方法。
代码语言:javascript
代码运行次数:0
运行
复制
task('A',{//任务名称,闭包都作为参数
    println "taskA..."
})
task('B'){//闭包作为最后一个参数可以直接从括号中拿出来
    println "taskB..."
}
task C{//groovy语法支持省略方法括号:上面三种本质是一种
    println "taskC..."
}
def map=new HashMap<String,Object>();
map.put("action",{println "taskD.."}) //action属性可以设置为闭包
task(map,"D");
tasks.create('E'){//使用tasks的create方法
    println "taskE.."
}
tasks.register('f'){ //注:register执行的是延迟创建。也即只有当task被需要使用的时候才会被创建。
println "taskF "
}
  • Task的属性

配置项

描述

默认值

type

基于一个存在的Task来创建,和我们类继承差不多

DefaultTask

overwrite

是否替换存在的Task,这个和type配合起来使用

false

dependsOn

用于配置任务的依赖

[]

action

添加到任务中的一个Action或者一个闭包

null

description

用于配置任务的描述

null

group

用于配置任务的分组

null

demo:

Task的类型

常见任务类型

该类型任务的作用

Delete

删除文件或目录

Copy

将文件复制到目标目录中。此任务还可以在复制时重命名和筛选文件。

CreateStartScripts

创建启动脚本

Exec

执行命令行进程

GenerateMavenPom

生成 Maven 模块描述符(POM)文件。

GradleBuild

执行 Gradle 构建

Jar

组装 JAR 归档文件

JavaCompile

编译 Java 源文件

Javadoc

为 Java 类 生 成 HTML API 文 档

PublishToMavenRepository

将 MavenPublication 发布到 mavenartifactrepostal。

Tar

组装 TAR 存档文件

Test

执行 JUnit (3.8.x、4.x 或 5.x)或 TestNG 测试。

Upload

将 Configuration 的构件上传到一组存储库。

War

组装 WAR 档案。

Zip

组装 ZIP 归档文件。默认是压缩 ZIP 的内容。

参看官方地址:https://docs.gradle.org/current/dsl/index.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上遇见你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Gradle生命周期
  • Setting文件
  • Gradle对测试的支持
    • Junit的使用
      • Gradle对Junit 4的支持
      • Gradle对Junit 5的支持
    • 包含和排除特定测试
  • Task
    • 任务的行为
      • 底层原理分析
    • 常用命令
    • task的定义方式
    • Task的类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档