新一代的构建工具Gradle

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'  //强制指定具体版本的依赖

    }

}

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值