Gradle是什么?
一个开源的项目自动化构建工具, 建立在apache ant和maven的基础上, 并引入基于Groovy的特定领域语言(DSL), 不再使用xml形式管理构建脚本.
构建工具的发展阶段: Ant --> Maven --> Gradle
准备工作
① 安装gradle
② 配置环境变量, 新建key为GRADLE_HOME, value为gradle的路径, 再将gradle下的bin目录配置到path路径下
基本介绍
Groovy是什么?
Groovy是用于Java虚拟机的一种敏捷的动态语言, 它是一种成熟的面向对象的编程语言, 既可以用于面向对象编程, 又可以用作纯粹的脚本语言, 使用该种语言不必编写过多的代码, 同时又具有闭包和动态语言中的其他特性.
与Java的比较
● Groovy完全兼容Java语法
● 分号是可选的
● 类/方法默认是public的
● 编译器给属性自动添加getter/setter方法
● 属性可以直接用点号获取
● 最后一个表达式的值会被作为返回值(可以不写return)
● == 等同于 equal(), 不会报空指针异常
高效的Groovy特性
● assert语句
● 可选类型定义
● 可选的括号
● 字符串
● 集合API
● 闭包
创建一个小例子(idea2018)
① new Project
② next
③ next
④ next --> finish
⑤ 选择Groovy视图
⑥ 编写代码
深入了解
Groovy的一些基本语法
//groovy的高效特性
//1.可选的类型定义
def version = 1 //def类似于js中的var(弱定义)
//2.assert
//assert version == 2 //失败, 因为version是为1
//3.括号是可选的
println(version) //结果是1
println version //结果还是1
//4.字符串
def s1 = 'idea' //仅仅是一个字符串
def s2 = "idea" //可以通过${}的形式插入其他变量, 如
def s4 = "my gradle version is ${version}" //插入变量
def s3 = '''this is
a
grovvy programming''' //可以换行
println s1
println s3
println s4
//5.集合API
//list
def buildTools = ['ant', 'maven'] //默认是ArrayList类型的集合
buildTools << 'gradle' //追加
assert buildTools.getClass() == ArrayList
assert buildTools.size() == 3
//map
def buildYears = ['ant':2000, 'maven':2004]
buildYears.gradle = 2009 //添加进map
println buildYears.ant
println buildYears['gradle']
println buildYears.getClass() //默认是LinkedHashMap
//闭包
//简单讲就是一个代码块, 类似方法, 参数可有无, 可以被赋值给一个变量, 也可以被当成一个参数传递给一个方法
//在Groovy中闭包的常见使用的方式
def c1 = { //定义闭包c1
v ->
print v
}
def c2 = { //定义闭包c2
print 'hello'
}
def method01(Closure closure){
closure('param ==> ')
}
def method02(Closure closure){
closure()
}
method01(c1)
method02(c2)
输出
1
1
idea
this is
a
grovvy programming
my gradle version is 1
2000
2009
class java.util.LinkedHashMap
param ==> hello
构建脚本
构建块: Gradle构建中的两个基本概念是项目(project)和任务(task), 每个构建至少包含一个项目, 项目中包含一个或多个任务, 在多项目构建中, 一个项目可以依赖于其他的项目, 类似的, 任务可以形成一个依赖关系图来确保他们的执行顺序
项目(project)
● groupId name(artifactId) version
● apply(指定应用某个插件) dependencies(声明依赖的jar / 其他的项目) repositories(声明具体的仓库) task(声明项目中的任务)
● ext gradle.properties
任务(task)
● 包括任务动作和任务依赖, 任务动作定义了一个最小的工作单元, 可以定义依赖于其他任务, 动作序列和执行条件
● dependsOn: 声明任务依赖
● doFirst doLast(<<): 在动作列表的最前边添加一个动作 / 在任务列表的末尾添加一个动作
自定义任务
由于ide工具创建gradle项目时是没法自动生成对应的目录的(src/main/java; src/main/resources...), 所以可以自己自定义一个任务来生成这些文件夹
自定义生成文件夹的任务
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', 'src/test/resources'] doFirst{ paths.forEach(createDir) } }
测试结果
构建生命周期
初始化(初始化将要参与到构建中的项目) --> 配置(根据配置代码<除了动作代码之外都是配置代码>生成task的依赖顺序和执行顺序) --> 执行(执行动作代码) --> 完成构建
● task <任务名>{project.version = '1.0'}, 那么该段代码在配置阶段就会被执行
● task <任务名> doLast{<添加的内容>}, 那么该段代码在动作阶段就会被执行
● 配置代码不能放在动作代码的部分, 否则无法完成构建
依赖管理
自动化的依赖管理可以明确依赖的版本, 可以解决因传递性依赖带来的版本冲突
● 引入规则
① compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.3.Final' //引入编译时的jar
testCompile group: 'junit', name: 'junit', version: '4.12' //引入测试编译时的jar
② compile 'ch.qos.logback:logback-classic:1.2.1' //第二种引入编译时的jar的方式(推荐使用)
● 工件(jar包)坐标(groupId, name<artifactId, version>)
● 常用仓库: mavenCentral(maven的中央仓库) / jcentral(Java和Android的中央仓库)
repositories {
maven{
url '' //指定私服
}
mavenLocal() //指定本地仓库
mavenCentral() //指定maven的中央仓库
}
● 依赖传递性: 运行时阶段扩展于编译阶段
dependencies {
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
● 版本冲突
① 查看依赖报告
② gradle会默认指定一个最高版本的jar, 可以修改默认策略
③ 排除传递性依赖
compile ('ch.qos.logback:logback-classic:1.2.1'){
exclude group:'<groupId>', module:'<artifactId>'
}
④ 强制一个版本
configurations.all{
resolutionStrategy{
failOnVersionConflict() //如果出现版本冲突则报错
force 'groupId:artifactId:version' //强制指定具体版本的依赖
}
}