• Gradle学习(从0到1精通)


    Gradle是一款Google推出的 基于JVM、 通用灵活的 项目构建工具, 支持Maven,JCenter多种第三方仓库;支持传递性依赖管理、废弃了繁杂的xml文件,转而使用 简洁的 、 支持多种语言 (例如:java、groovy等)的 build脚本文件 。

    在这里插入图片描述

    为什么学习 Gradle

    • Gradle基于Groovy语言,提供了丰富且简洁的语法,甚至可以像写代码一样在Gradle的脚本文件中编写对应的语句执行对应的操作。
    • 在脚本文件build.gradle中,可以根据约定进行配置,简洁易读
    • 总结一下,就是很灵活,可扩展性和定制化比较好

    mark一下:spring framework就是使用gradle构建的

    常见的构建工具有 Ant、maven 等。但它们都有一些缺点:

    • Ant 的缺点:依赖管理较弱,很容易变臃肿, XML 作为构建脚本

    • Maven 的缺点:比较精简,但限制性太多,编写插件扩展麻烦,XML 作为构建脚本。

    由于 Gradle 是基于 Groovy,所以要学习 Gradle,必须要掌握一定的 Groovy 基础。

    Groovy

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

    基础

    构建块:

    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)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    构建生命周期:

    初始化->配置->执行

    依赖管理:

    几乎所有的基于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'
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    解决版本冲突:
    • 查看依赖报告
    • 排除传递性依赖
    • 强制一个版本
    修改默认解决策略:
        configurations.all{
            resolutionStrategy{
                failOnVersionConflict()
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    排除传递性依赖

    compile('org.hibernate:hibernate-core:3.6.3.Final'){
        exclude group:"org.slf.4j",module:"slf4j-api"
        //transitive = false
    }
    
    • 1
    • 2
    • 3
    • 4

    强制指定一个版本

    configurations.all{
        resolutionStrategy{
            force 'org.slf4j:slf4j-api:1.7.24'
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    多项目构建

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

    rootProject.name = 'todo'
    include 'respository'
    include 'model'
    include 'web'
    
    • 1
    • 2
    • 3
    • 4
    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 "私服"
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    Gradle的学习有很多知识点需要深入,本文只是从它的背景出发,了解Gradle。

    网上关于 Gradle 的教程很多,但很多都是以“面”切入— 通过大量讲解其用法及其 API 分类来阐述。但 Gradle API 使用技巧众多,API 更是成千上百,臣妾记不住呀。个人深信,技术之道与练功之道是一致的,“想要旷世武功,先练内功”。本文尝试以“点”切入,阐述一下学习 Gradle 的门路。整合资料《Gradle学习手册》需要可点击领取。部分截图如下:
    在这里插入图片描述
    在这里插入图片描述

    结尾

    Gradle不仅是目前Android最主流的构建工具。而且不少技术领域如组件化、插件化、热修复,及构建系统(很多优秀的框架都是在编译时或者打包之前做一些特殊的处理),都需要通过Gradle来实现,不懂Gradle将无法完成上述事情,所以学习Gradle非常必要

  • 相关阅读:
    解析:hyperf 官方骨架包的 Dockerfile
    Flink之Watermark策略代码模板
    Himall商城Web帮助类 获得http请求数据
    “如何应用数据分析提升软件开发流程效率?”
    linux 安装tomcat 图文详解全过程
    原博客迁移
    几种Python处理Excel数据的方法!
    基于.NetCore开发博客项目 StarBlog - (9) 图片批量导入
    养生产品如何进行线上推广?产品线上推广的渠道有哪些?
    【Java SE]位运算和移位运算注意事项
  • 原文地址:https://blog.csdn.net/Androidxiaofei/article/details/126324421