新一代构建工具gradle
一. 课程介绍
1.1 项目自动化介绍
-
石器时代:
- 依赖管理,测试,打包,上传
-
构建工具的作用:
- 依赖管理
- 测试、打包、发布
- 机器能干的事情,自己绝不动手;
-
主流构建工具:
- Ant:编译、测试、打包
- Maven:依赖管理、发布
- Gradle:Groovy(避免了啰嗦和臃肿,具有更高的灵活性和可扩展性)
-
Gradle:
- 它是一个开源的项目自动化构建工具,建立在Apache Ant和Apache Maven概念的基础上,并引入了基于Groovy的特定领域语言(DSL),而不再使用XML形式管理构建脚本;
1.2 课程介绍
- 快速尝鲜:
- 准备使用Gradle
- 第一个Gradle项目
- 基本原理:
- 构建脚本介绍
- 依赖管理
- 深入实战:
- 多项目构建
- 测试
- 发布
二. 准备使用Gradle
2.1 gradle的安装
- 确保已经安装了JDK,打开cmd命令窗口,输入以下命令校验:
java -version
成功如图所示:
- 安装Gradle:
- 从Gradle官网下载Gradle,地址为:
https://gradle.org
- 配置环境变量:GRADEL_HOME
- 添加到Path,%GRADLE_HOME%\bin;
- 验证是否安装成功,gradle -v
成功如图所示:
- 从Gradle官网下载Gradle,地址为:
2.2 Groovy基础知识–理论介绍
- Groovy是什么?
- Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性;
- 与Java比较?
- Groovy完全兼容Java的语法
- 分号是可选的(一行代码的分号可以省略)
- 类、方法默认是public的;
- 编译器给属性自动添加getter/setter方法
- 属性可以直接用点号获取
- 最后一个表达式的值会被作为返回值;
- ==等同于equals(),不会有NullPointerExceptions;
- 高效的Groovy特性
- assert语句
- 可选类型定义
- 可选的括号
- 字符串
- 集合API
- 闭包
2.3 Groovy高效特性
- 可选的类型定义
def version=1
- assert
def version=1
assert version == 2
- 括号是可选的
def version=1
println version
- 字符串(单引号是字符串,双引号可以插入变量,三引号可以换行)
def s1='my'
def s2="my name is ${version}"
def s3='''my
name
is
zhangsan'''
- 集合api
// list
def buildTools=[‘ant’,‘maven’]
buildTools << ‘gradle’
assert buildTools.getClass() == ArrayList
assert buildTools.size() == 3
在groovy中,集合对应的是ArrayList,以上两个assert断言结果均为true
// map
def buildYears= [‘ant’:2000,‘maven’:2004]
buildYears.gradle=2009
println buildYears.ant
println buildYears[‘gradle’]
println buildYears.getClass()
在Groovy中,map对应的是LinkedHashMap;
// 闭包
它类似一个方法或者代码块,简单了解一下即可。需要详细了解可百度;
2.4 Groovy基础知识-- 重点
- 代码如下:
apply plugin:'java' version = '0.1' // 闭包 repositories { mavenCentral() } // 闭包 dependencies { compile 'commons-codec:commons-codec:1.6' }
默认作用域都是public
每一个Groovy构建脚本都有一个Project实例
三. 第一个Gradle项目
3.1 第一个Gradle项目介绍
- 实例介绍:
- ToDO应用程序,只实现添加待办事项
- Java应用程序版
- Web版
3.2 创建一个Gradle项目
- 选择 File -> New Project -> 选择Gradle. 如图所示:
- 根据实际填入: GroupId、ArtifactId、Version
- 选择GradleHome路径、Gradle JVM路径,如图所示:
- 根据实际填入: Project Name 、 Project Location(工程路径)
- 创建项目成功后,自动生成了配置文件build.gradle,如图所示:
- 目录结构如下:
- IDEA右侧小窗口,点击Gradle-> Tasks->build,里面是常用的命令;
- clean: 与Maven类似
- build: 构建,执行的是所属项目下的 build.gradle文件,如果使用的是java的插件,生成的也是jar包;
- jar,与build命令类似,把当前源文件编译打成jar包;
jar包在build目录的libs下面,如图所示:
- 启动jar包:
- 如果里面没有main方法,则可以被其他项目所引用
- 如果里面有main方法,我们可以通过命令运行,如图所示:
3.3 TODO-WEB版
- 如图所示,提供一个web应用程序
- 我们需要打成war包,在build.gradle进行修改,添加war插件:
apply plgin: 'war'
如图所示:
- 点击 war,构建成war包。 将此war包放入tomcat中进行执行,放入webapps,运行tomcat,访问web页面能成功显示则说明成功;
gradle有很多构建工具,我们可以访问官网及其他文档了解详细;
四. 高级应用
4.1 构建脚本介绍
-
构建块:
- Gradle构建中的两个基本概念是项目(project)和任务(task),每个构建至少包含一个项目,项目中包含一个或多个任务。在多项目构建中,一个项目可以依赖于其他项目;类似的,任务可以形成一个依赖关系图来确保他们的执行顺序;
-
项目-任务 关系:
-
项目(project)
- 一个项目代表一个正在构建的组件(比如一个jar文件),当构建启动后,Gradle会基于build.gradle实例化一个org.gradle.api.Project类,并且能够通过project变量使其隐式可用;
- 属性:
- group: 组
- name:名,不能重名
- version:版本号
通过组,名称和版本的组合,最终确定一个唯一的项目;
- apply: 应用一个插件
- dependencies:声明用到哪些依赖
- repositories:告诉gradle去哪里的仓库去找这些依赖jar包(这里可以将中央仓库替换为公共仓库)
- task: 用来声明项目中有哪些人物
- ext:定义属性,直接引用
- gradle.properties:键值对定义属性
-
任务(task)
- 概述:
- 任务对应org.gradle.api.Task. 主要包括人物动作和任务依赖。任务动作定义了一个最小的工作单元。可以定义依赖于其他任务、动作序列和执行条件;
- 字段:
- dependsOn: 声明任务依赖
- doFirst、doLast:简写,表示在任务之前或者之后添加一个动作;
当我们执行一个jar任务时,会先进行编译等其他任务操作。说明jar任务是依赖于其他任务的;
任务在一个项目中是非必需的。同时一般情况下我们使用插件提供的任务即可,若有不满足的,可自定义任务; - 概述:
4.2 自定义任务
-
自定义任务,自动创建java目录
- 在build.gradle中创建代码:
def createDir={ path-> File dir =new File(path) if(!dir.exists()){ dir.mkdirs(); } } task makeJavaDir(){ def paths=['src/main/java','src/main/resources','src/test/java'] } doFirst{ paths.forEach(createDir); }
如图所示:
- 在build.gradle中创建代码:
-
新建一个任务,可引入别的任务基础上新建,如图所示:
自定义任务在other下;
4.3 构建生命周期
- 构建生命周期,如图所示:
在配置阶段就要决定任务的执行顺序以及关系,而执行时则直接执行代码了;在执行时是不能再去决定任务的执行顺序等操作;
- 详细生命周期:
- 初始化: 初始化项目,确定有哪些项目要参与到构建中来;
- 配置阶段:生成task的依赖关系及执行顺序
- 执行阶段:执行task的动作
4.4 依赖管理
-
概述:
- 几乎所有的基于JVM的软件项目都需要依赖外部类库来重用现有的功能。自动化的依赖管理可以明确依赖的版本,可以解决因传递性依赖带来的版本冲突。
-
工件坐标:
- group、name、version
根据这三种,可以唯一确定一个项目;
-
常用仓库:
- mavenLocal: 本机仓库
- mavenCentral/jcenter: 公共仓库
- 自定义maven仓库
- 文件仓库
-
依赖的传递性
- B依赖A,如果C依赖B,那么C依赖A
正是依赖的传递性,才会出现依赖冲突;
-自动化依赖管理:
-
依赖阶段配置:
- compile、 runtime
- testCompile、testRuntime
-
依赖阶段关系:
源代码依赖的,测试一定依赖。测试依赖的,源代码不一定依赖;
-
serch.maven.org 中央仓库
-
添加依赖:
dependencies{ compile 'ch.qos.logback:logback-classic:1.2.1', testCompile group:'junit',name:'junit',version:'...' }
-
添加依赖后,在右侧Source Sets下会出现相应的jar包,在Dependencies中;
-
仓库配置如下:
仓库可以配置多个,以前后顺序,在前面的优先执行;同时中央仓库在国外,可能下载网速较慢,我们可以使用公司公共仓库,提高下载速度;
4.5 解决版本冲突
- 查看依赖报告
- 排除依赖jar包
- 强制制定一个版本(可以制定一个最新的版本)
gradle可以帮我们处理版本冲突,它会默认使用最新的jar包。如果这样也解决不了,我们可以修改默认解决策略,然后查看依赖报告;
- 修改默认解决策略:
configurations.all{ resolutionStrategy{ failOnVersionConflict(); } }
如图所示:
- 排除一个jar包,如图所示:
- 强制指定一个版本
configurations.all{ resolutionStrategy{ force 'org.slf4j:slf4j-api:1.7.24' } }
如图所示:
4.6 多项目构建
-
项目模块化
- 在企业项目中,包层次和类关系比较复杂,把代码拆分成模块通常是最佳实践,这需要你清晰的划分功能的边界,比如把业务逻辑和数据持久化拆分开来。项目符合高内聚低耦合时,模块化就变得很容易,这是一条非常好的软件开发实践;
- 使用compile project(":要引入的项目名"),可以引入其他项目进此项目中,如图所示:
-
settings.gradle:用来构建多项目的。
-
当我们在根目录的 build.gradle配置时,一些通用的配置可以在根目录进行配置,以减少重复配置;
- 如图所示:
- 如图所示:
4.7 自动化测试
- 一些开源的测试框架比如JUnit,TestNG能够帮助你编写可复用的结构化测试,为了运行这些测试,你要先编译它们,就像编译源代码一样。测试代码的作用仅仅用于测试的情况,不应该被发布到生产环境中,需要把源代码和测试代码分开来。
- 测试配置:
dependencies{ testCompile 'junit:junit:4.11' }
- 测试发现:
- 任何集成至
junit.framework.TestCase
或groovy.util.GroovyTestCase
的类 - 任何被@RunWith注解的类
- 任何至少包含一个被@Test注解的类
- 任何集成至
4.8 发布
- 通过引入maven-publish插件,并配置了publishing内容,我们可以将生成的jar包推送至本地仓库或者远程公共仓库,如图所示:
五. 课程总结
- 安装gradle
- groovy知识
- 构建脚本
- 依赖管理
- 测试
- 发布
- 如图所示:
课程已结束,学习无终点,祝大家好运。点击关注,查看更多,期待更多~