天天看点

Gradle基础学习

Gradle

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。

Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。

Gradle安装

官网:https://gradle.org/

Gradle安装要先安装jdk,然后配置环境变量。

Groovy

Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该中语言不必编写过多的代码,同时又具有闭包和动态语言中的其它特性。

与Java比较:

- Groovy完全兼容Java的语法

- 分号是可选的

- 类、方法默认是public的

- 编译器给属性自动添加getter/setter方法

- 属性可以直接用点号获取

- 最后一个表达式的值会被作为返回值

- ==等同于equals(),不会有NullPointerException

高效特性:

- assert语句

- 可选类型定义

- 可选的括号

- 字符串

- 集合API(List,Map)

- 闭包

基础

构建块:

Gradle构建中两个基本概念是项目(project)和任务(task),每个构建至少包含一个项目,项目中包含一个或多个任务。在多项目构建中,一个项目可以依赖于其它项目,类似的,任务可以形成一个依赖关系图来确保他们的执行顺序。

任务(task):

任务对应org.gradle.api.Task。主要包括任务动作和任务依赖。任务动作定义了一个最小的工作单元。可以定义一路于其它任务、动作序列和执行条件。

方法:

- dependsOn

- doFirst、doLast

自定义任务:

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{
        path.forEach(createDir);
    }
}


task makeWebDir(){
    dependsOn 'makeJavaDir'
    def paths = ['src/main/webapp','src/test/webapp'];
    deLast {
        paths.forEach(createDir)
    }
}
           

构建生命周期:

初始化->配置->执行

依赖管理:

几乎所有的基于JVM的软件项目都需要依赖外部类库来重用现有的功能。自动化的依赖管理可以明确依赖的版本,可以解决因传递依赖带来的版本冲突。

工件坐标:

- group、name、version

常用仓库:

- mavenLocal/mavenCentral/jcenter

- 自定义maven仓库

- 文件仓库

依赖的传递性

依赖阶段关系:

repositories {
        // Use 'jcenter' for resolving your dependencies.
        // You can declare any Maven/Ivy/file repository here.
        jcenter()
    }

    dependencies {
        // The production code uses the SLF4J logging API at compile time
        compile 'org.slf4j:slf4j-api:1.7.21'

        // Declare the dependency for your favourite test framework you want to use in your tests.
        // TestNG is also supported by the Gradle Test task. Just change the
        // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
        // 'test.useTestNG()' to your build script.
        testCompile 'junit:junit:4.12'
    }
           

解决版本冲突:

- 查看依赖报告

- 排除传递性依赖

- 强制一个版本

修改默认解决策略:

configurations.all{
        resolutionStrategy{
            failOnVersionConflict()
        }
    }
           
  • 排除传递性依赖
    compile('org.hibernate:hibernate-core:3.6.3.Final'){
        exclude group:"org.slf.4j",module:"slf4j-api"
        //transitive = false
    }
               
  • 强制指定一个版本
    configurations.all{
        resolutionStrategy{
            force 'org.slf4j:slf4j-api:1.7.24'
        }
    }
               

多项目构建

项目模块化:在企业项目中,包含次和类关系比较复杂,把代码拆分成模块通常是最佳实践,这需要你清晰的划分功能的边界,比如把业务逻辑和数据持久化拆分开来。项目符合高高内聚低耦合时,模块化就变的很容易,这个一条非常好的软件开发实践。

rootProject.name = 'todo'
    include 'respository'
    include 'model'
    include 'web'
           

Gradle测试

自动化测试:一些开源的测试框架比如JUnit,TestNG能够帮助你编写可复用的结构化的测试,为了运行这些测试,你要先编译它们,就像编译源代码一样。测试代码的作用仅仅用于测试的情况,不应该被发布到生产环境中,需要把源代码和测试代码分开来。

测试发现:

- 继承自junit.framework.TestCase或groovy.util.GroovyTestCase的类

- 任何被@RunWith注解的类

- 任何至少包含一个被@Test注解的类

发布:

apply plugin: 'maven-publish'

    publishing {
        publications {
            myPublish(MavenPublication){
                from components.java
            }
        }
        repositories {
            maven {
                name "myRepo"
                url "私服"
            }
        }
    }
           

继续阅读