Gradle学习(从0到1精通)

发布于:2023-01-19 ⋅ 阅读:(532) ⋅ 点赞:(0)

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)
    }
}
构建生命周期:

初始化->配置->执行

依赖管理:

几乎所有的基于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 "私服"
        }
    }
}

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

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

结尾

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

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到