zoukankan      html  css  js  c++  java
  • Java Gradle入门指南之简介、安装与任务管理

    博客逐步迁移至 极客兔兔的小站

        这是一篇Java Gradle入门级的随笔,主要介绍Gradle的安装与基本语法,这些内容是理解和创建build.gradle的基础,关于Gradle各种插件的使用将会在其他随笔中介绍。
        有什么疑问欢迎在文末关注留言,如果本文对你有用,那在右下角点个推荐吧~

    1.Gradle简介与安装

    1.1 简介

    • Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。
    • Gradle支持多工程构建,提供强大的依赖管理,支持传递性依赖管理(无需配置XML);自动化Java开发中的编译、打包、执行测试案例等过程;同时Gradle支持丰富的插件,例如Java Web自动化部署的war、gretty插件等。

    1.2 安装

    • Windows:下载安装包,安装之后,将GRADLE_HOME/bin添加到环境变量。
    • Linux:安装Gradle之后,配置PATH

    (1) 在~/.profile中加入GRADLE_HOME = YOUR_INSTALLATION_DIR

    (2) 在~/.profile中加入PATH=$PATH:$GRADLE_HOME/bin
    (3) 执行source ~/.profile重新加载profile文件

    • 命令行下执行gradle -v可测试配置是否正确,更多命令行用法可执行gradle -h
    • 本文代码测试版本为Gradle 2.11

    2.任务(task)管理

        一个脚本是一系列待执行操作(action)、属性的集合,有时,我们只想执行其中的某几个操作,那这几个操作及其相关的属性构成了一个任务(task),任务是gradle中的执行单元。比任务更大的是项目(project),往往包括多个任务。

    2.1 创建第一个task

    task hello << {
        println "Hello World!" + project.name // => Test
        // 或 println "Hello World!$project.name" // =>Test
    }
    
    
    • 在某个目录下(例如~/Test)新建文件build.gradle,文件内写入上述代码
    • 切换到该目录,执行gradle hello,执行结果为Hello World!Test,若没有单独配置,项目名一般与当前文件夹名称相同。
    • 执行这个脚本时,gradle调用org.gradle.api.Project创建一个实例project ,你可以用project.XX(在字符串中用$project.XX)去使用这个实例
    • project有四个属性,name(只读),parent(只读),version,description

    2.2 设置属性与任务执行

    //已存在属性直接赋值即可
    version = "1.0"  
    description = "I Am A Gradle Test!"  
    // 新增属性需要使用 ext
    ext {
        createDate = "Mar 2016"  
    }
    ext.creator = "呆尐兔兔"
    // task hello1
    task hello1 {
        doFirst {
            // name为task的内置属性,值为task名称
            println "1. My Name is " + name  // ==> hello
            println "2. I Belong To Project $project.name" //=>Test
        }
        doLast {
            println "3. The Version Is " + project.version
            println "4. I Am Created On " + project.createDate
        }
    }
    // task hello2
    task hello2 << {
        ext { nickname = "excited"}
        println "Step 2: $nickname" //=> excited
    }
    hello2.doFirst { println "Step 1" }
    hello2.doLast { println "Step 3 " }
    
    执行结果如下
    C:UsersgzdDesktopTest>gradle hello1 hello2
    :hello1
    1. My Name is hello1
    2. I Belong To Project Test
    3. The Version Is 1.0
    4. I Am Created On Mar 2016
    :hello2
    Step 1
    Step 2: excited
    Step 3
    
    • gradle [task1] [task2] [...],执行多个任务
    • hello是Task对象一个实例,同样继承了一些属性,例如name、description等,可在task中使用ext新增属性
    • doFirstdoLast方法为task内置方法,先后执行, << 操作符在Groovy中作用是添加元素,三者一起使用,顺序doFirst-><<->doLast。<< 常用来开速添加任务。

    2.3 任务依赖

    // 单任务依赖
    // 该任务依赖的其他任务将先执行
    task hello1 << {
        println "Step 1"
    }
    task hello2(dependsOn:hello1) << {
        println "Step 2"
    }
    // 等价于 task hello2 << { println "Step 2" }
    // hello2.dependsOn hello1
    
    // 多任务依赖
    task hello2 << { 
        // ...
    }
    hello2.dependsOn hello1, hello3
    // 等价于 task hello2(dependsOn: [hello1,hello3]) << { ... }
    

    2.4 任务执行顺序与动态任务

    task hello1 << {
        println "Step 1"
    }
    task hello0 << {
        println "Step 0"
    }
    task hello2(dependsOn:[hello1,hello0]) << { 
        println "Step 2" 
    }
    task hello3 << {
        println "Step 3"
    }
    
    以下是执行结果
    C:UsersgzdDesktopTest>gradle hello2 hello3
    Step 0
    Step 1
    Step 2
    Step 3
    
    • 上述代码存在任务1,2,3,4,任务2依赖于任务1与任务0,执行gradle hello2 hello3,将依次执行任务0,1,2,最后执行3。
    • 尽管任务1定义在任务0前面,依赖时顺序也是 1,0,对于依赖的任务,gradle的执行顺序按照字母表
    • gradle 提供了shouldRunAftermustRunAfterfinalizedBy三个选项帮助定义任务执行顺序。
    // 使用groovy语法动态构建任务
    (1..6).each {
        task "hello$it" << {
            println "Executing $name" //=>hello(1..6) 见2.2
        }
    }
    
    hello1.dependsOn hello2
    hello3.dependsOn hello2
    
    hello5.finalizedBy hello6
    hello5.mustRunAfter hello4
    
    依次执行下列命令
    gradle hello1 ==> 2->1
    gradle hello1,hello3 ==> 2->1->3
    gradle hello5 ==> 5->6
    gradle hello5,hello4 ==> 4->5->6
    
    • shouldRunAfter表示应该但不强制,mustRunAfter表示强制
    // 考虑以下代码,执行gradle hello1将会报错
    // 换为shouldRunAfter则不会报错,执行顺序为3->2->1
    hello1.dependsOn hello2
    hello2.dependsOn hello3
    hello3.mustRunAfter hello1
    
    • 另一个例子
    // 以下代码将构建出hello0,hello1,hello2,hello3
    // 下标从0开始
    4.times { counter ->
        task "hello$counter" << {
            println "I'm $name" //=> hello[0..3]
        }
    }
    
    • 使用addRule动态创建任务
    // 以下代码将匹配以clean开头的任务
    // 例如gradle cleanTest => Task is cleanTest
    // gradle cleanHello => Task is cleanHello
    tasks.addRule("Pattern:clean<fileName>") { String taskName ->
        if(taskName.startsWith("clean")) {
            task(taskName) << {
                println "Task is $name";
            }
        }
    }
    

    2.5 任务名称简写

    • gradle支持在执行命令时使用任务的简写(每个单词第一个字母
    • 例如执行gradle hello1, 可以简写为gradle h1
    • 例如执行gradle helloWorld1,helloWorld2,可简写为gradle hW1,hW2

    2.6 条件执行

    2.6.1 onlyIf

    // gradle hello =>  hello:SKIPPED(条件不满足,不执行)
    // onlyIf 常用于判断当前环境是否满足执行条件
    version = '1.0'
    ext {
        createYear = '2015'
    }
    task hello << {
        println 'I was Created in ' + createYear 
    }
    hello.onlyIf { project.hasProperty('createYear') && 
        project.createYear == '2016'}
    

    2.6.2 enabled

    // gradle h2 => :hello1 SKIPPED :hello2 Step 2
    // 即使2依赖1,1被禁用,2仍能执行
    // 常用于测试,更换旧代码
    task hello1 << {
        println 'Step 1' 
    }
    task hello2(dependsOn:hello1) << {
        println 'Step 2'
    }
    hello1.enabled = false
    
    • 由于enabled是task的一个属性,hello1 可以写为
    task hello1 {
        enabled = false;
        doLast { println 'Step 1' }
    }
    

    2.7 编译优化

    task hello {
        ext {
            testFile = file('in.txt')
        }
        String outFileName = 'out.txt'
        File outFile = new File(outFileName)
        inputs.file testFile
        outputs.file outFile
    
        doLast {
            def property = new XmlParser().parse(testFile)
            def key = property.key[0].text()
            def value = property.value[0].text()
            def destFile = new File(outFileName)
            destFile.text = "$key = $value"
        }
    }
    
    第一次执行
    gradle hello => :hello BUILD SUCCESSFUL
    第二次执行 
    gradle hello => :hello UP-TO-DATE
    
    • gradle会自动对输入输出操作的task进行编译优化,例如上面的例子,第一次执行时,需要打开输入文件,创建输出文件,当第二次这个命令时,gradle发现输入输出文件并没有发生变化,因此显示UP-TO-DATE,即没有必要执行这个命令了,这在实际项目开发过程中,将节省大量的时间
    • 当输入输出文件发生改变(例如删除out.txt),任务将重新编译执行
    • 如果需要强制执行,及时输入输出没有发生改变,可以使用--rerun-tasks参数
    gradle hello --rerun-tasks
    // gradle -b build.gradle hello --rerun-tasks
    
  • 相关阅读:
    织梦DedeCms调用全站相关文章方法
    利用dedecms autoindex让文章列表加上序列号
    织梦技巧之---织梦dedecms后台验证码错误的解决方法
    在织梦后台全站更新是出现“DedeTag Engine Create File False”错误的解决办法
    DEDECMS后台空白,dede网站栏目管理空白解决方法
    dedeCms搬家说明-官方教程绝对有够详细
    教你织梦DEDE自动更新首页的办法
    DSP using MATLAB 示例Example2.12
    DSP using MATLAB 示例Example2.11
    DSP using MATlAB 示例Example2.10
  • 原文地址:https://www.cnblogs.com/gzdaijie/p/5280751.html
Copyright © 2011-2022 走看看