Gradle之重新认识Gradle(项目结构、命令行、task、构建Java项目、包装器)

前言:之前一直接触使用Gradle完成Android项目的自动化构建,所谓重新认识Gradle是因为最近看了《Gradle IN Action》一书,对gradle进行了一次全面的重新的认识。所以决定以系列博客,来完成自己对Gradle学习之路的一个总结。关于书中的一些源码我备份了一份在github上:https://github.com/ChenSWD/CopyGradleInAction,有该书的pdf版本,所有目录名以”-注释“结尾的是在博客中引用过的脚本,都是添加了代码注释的。

一、重新梳理认识一些概念

1、项目自动化:有效的项目自动化是促使软件成功交付的关键因素,是以一种可重复、可持续的方式构建和交付软件。它的好处有:①防止手动介入项目的交付带来的耗时和错误,毕竟人为的编译拷贝等操作总会避免不了犯错;②可以创建重复的构建,即:将重复有序的软件构建过程组装起来;③不依赖于特定类型的操作系统,具有可移植性。

2、构建工具:构建工具是一种可编程工具,能够让你以可执行和有序的任务来表达自动化的需求。如图,每个任务代表一个工作单元,这些任务的执行顺序非常重要,编译任务就必须要在拷贝之前完成。Java的构建工具一般有Ant、Maven、当然还有Gradle。
这里写图片描述

3、Gradle:Gradle是基于JVM构建工具的新一代版本,它使用一种强大且具有表达性的基于Groovy的领域特定语言(DSL),而不是XML(Ant、Maven基于xml),允许使用Java或者Groovy语言编写定制逻辑,其实Gradle就是Groovy,它提供了基于Java的语法糖,你编写的所有脚本都是Groovy,能够以编程语言来表达你需要的构建是Gradle的一大亮点。Gradle的座右铭:“让不可能成为可能,让可能变得简单,让简单变得优雅”
这里写图片描述
Gradle的特性简单介绍:
①可表达性的构建语言和底层API:在Gradle脚本中每一个元素都有一个与Java类一对一的映射,如每一个构建脚本映射成Gradle API中的Project类型的一个实例,dependencies配置块触发project实例的dependencies()方法。
②灵活的约定:Gradle最主要的思想之一就是针对你的项目给予引导和有意义的默认值,Gradle具有统一的项目结构布局(如图),Gradle中的每个Java项目都确切的知道源码和测试类文件的位置,知道如何编译源码,运行单元测试,发布代码,这些任务都被完全集成到了构建的生命周期中。
这里写图片描述
③鲁棒和强大的依赖管理:Gradle提供了一个基础设施去管理解析、获取和存储依赖的复杂性,一旦相关的依赖被下载到本地缓存中,那么在你的项目中就可以使用了。

二、Gradle的基本使用
1、每一个Gradle构建都是从一个脚本开始的。Gradle默认的构建脚本的名字是build.gradle,在执行gradle命令时,就会去寻找build.gralde文件。使用gradle命令行要配置gradle环境变量
①简单使用,从HelloWorld开始:创建一个build.gradle文件,定义一个helloWorld的任务(task),将打印语句添加到action中(doLast)。

task helloWorld{
    doLast{
        println('Hello World!')
    }
}
运行该task:
gradle -q helloWorld
Hello World!

②简单的任务依赖:

task startSession {
    doLast {
        chant()
    }
}

def chant() {
    /**每个脚本都带有一个ant属性,它赋予了直接访问ant任务的能力*/
    ant.echo 'Repeat after me...'
}
/**这是一个动态的task,可以在运行的时候指定它的名字。
 * 该方法是Groovy在java.lang.Number中扩展的times方法,
 * 创建3个新的task,隐含变量it(counter)指定循环的次数,这里使用计数器来创建task的名字.*/
3.times { counter ->
    task "yayGradle$counter" {
        doLast {
            println 'Gradle rocks'
        }
    }
}
/**dependsOn说明了task之间的依赖,gradle确保被依赖的task总是在其之前执行。*/
yayGradle0.dependsOn startSession
yayGradle2.dependsOn yayGradle1, yayGradle0
task groupTherapy(dependsOn: yayGradle2)

执行输出:
gradle groupTherapy
> Task :startSession 
[ant:echo] Repeat after me...
> Task :yayGradle0 
Gradle rocks
> Task :yayGradle1 
Gradle rocks
> Task :yayGradle2 
Gradle rocks

这里写图片描述

2、Gradle命令行:我们是通过命令行来执行gradle脚本的,如之前gradle helloWorld就直接可以运行helloWorld task。
①tasks 命令:gradle -q tasks命令可以显示该脚本所有可用的task,gradle -q tasks –all 可以获得关于task的更多信息。
②gradle命令可以一次执行多个任务,gradle yayGradle0 groupTherapy命令会先执行yayGradle0 任务在执行groupTherapy任务,但是任务只会执行一次,yayGradle0 作为groupTherapy的依赖也只会执行一次。
③gradle可以以守护进程开启,gradle helloWorld –daemon,启动后,gradle会在后续的构建中重用之前创建的守护进程,避免启动时造成开销。

3、构建Java项目。Gradle插件可以自动化执行相关构建的任务,Java插件是Gradle自身装载的一个插件,它为项目建立一个标准的项目布局,并确保有意义、有顺序地执行任务。
①使用Java插件:在build.gradle 文件中加入:

apply plugin:'java'

该行代码代表项目使用Java插件构建你写的Java代码,该插件会构建出一个JAR包。Gradle是怎么找到源码的位置呢?Java插件引入的约定之一就是源代码的位置,在默认情况下,插件会到src/main/java目录下查找。所以,需要将要参与编译构建的代码放到该目录下面,IDE一般在创建相关项目时就已经创建了相关的项目结构。
②开始构建。Java插件提供一个任务叫做build,该任务可以以正确的顺序编译源代码,组装成JAR文件。
build.gradle脚本文件如下,脚本可以动态的设置源码的目录和生成文件的目录,这里修改为out目录下。我们知道JAR文件有可运行和不可运行两种,可运行的JAR文件(可以通过java -jar 命令运行的JAR文件)需要有下面的Main-Class相关设置(要设置主类),否则只能当做普通工具包使用。

apply plugin: 'java'
/**定义项目的版本*/
version = 0.1
/**jdk版本*/
sourceCompatibility = JavaVersion.VERSION_1_7

sourceSets {
    main {
        java {
            /**设置项目的源码目录是src*/
            srcDirs = ['src']
        }
    }
    test {
        java {
            /**设置项目的测试代码目录是test*/
            srcDirs = ['test']
        }
    }
}
/**修改build生成目录,默认是build目录*/
buildDir = 'out'
/**设置主类,设置了该属性生成的JAR文件才能被执行*/
jar {
    manifest {
        attributes 'Main-Class': 'com.manning.gia.todo.ToDoApp'
    }
}

运行gradle build命令,UP-TO-DATE意味着任务被跳过,Gradle增量式构建支持自动鉴别不需要被运行的任务。NO-SOURCE因为我没有建相关目录。

>gradle build
> Task :compileJava UP-TO-DATE   //编译Java产品代码
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar UP-TO-DATE           //组装JAR文件
> Task :assemble UP-TO-DATE
> Task :compileTestJava NO-SOURCE  //编译测试代码,我没有编写相关测试代码
> Task :testClasses UP-TO-DATE     
> Task :test NO-SOURCE           //运行测试
> Task :check UP-TO-DATE
> Task :build UP-TO-DATE

③配置项目依赖,在Java世界里,依赖都是以JAR文件的形式发布的,许多类库可以在仓库中找到,仓库是一个文件系统或者是一个中心服务器,Gradle要求至少使用一个仓库来使用依赖。仓库就是存储你要依赖的项目的一个服务器,可以从里面下载你依赖的相关的JAR文件。使用依赖需要配置元素:repositories 和 dependencies。
build.gradle脚本,如何查找依赖:可以在Maven Central中查找依赖的详细信息。http://search.maven.org/ 上面,仓库提供了一个简单的搜索入口。

apply plugin: 'java'
/**配置对maven仓库的依赖,下载依赖源码的中心仓库  */
repositories {
    mavenCentral()
}
/**添加要依赖的库,现在一般使用implementation(compile被废弃)*/
dependencies {
    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.1'
}

运行脚本:compileJava任务会去下载相关的依赖

>gradle build
<-----<-----<-----Download https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.pom
Download https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar

4、Gradle包装器:能够让没有安装Gradle运行环境的机器运行Gradle构建。开发过程中,不同开发人员很可能因为选错构建工具版本或者运行时环境产生对构建结果不好的影响,比如在自己的机器上构建成功,在别的机器上却构建失败。
包装器可以让构建脚本运行在指定版本的Gradle上,它是通过自动从中心仓库下载Gradle,最终创建一个独立于系统和Gradle版本的可靠的和可重复的构建。
①配置build.gradle脚本:

/**创建一个包装器任务,通过改变gradleVersion的值和重新运行该任务可以升级包装器的版本*/
task wrapper(type: Wrapper) {
    gradleVersion = '4.4'
}

执行脚本:
>gradle wrapper

执行后,会生成构建器文件(下图),以后就可以用包装器的脚本执行构建了。
这里写图片描述

②使用包装器:linux执行gradlew的shell脚本,windows操作系统直接运行gradlew.bat,使用它们运行构建和使用已安装的Gradle运行构建是一样的。在包装器运行时,Gradle运行时会被下载、解包并使用,因为有下载Gradle过程,也许构建过程会比较慢。

③包装器下载的Gradle默认从Gradle网站(distributionUrl=https://services.gradle.org/distributions/gradle-4.4-bin.zip),但是如果不能访问外网的情况下(也许有些企业不允许访问外网),可以改变默认配置,将它指向存有运行时发布文件的企业内部服务器。
这里写图片描述

对于Gradle的基本认识的介绍就到这里,关于task的基本原理和高级使用请参考下一篇博客:https://blog.csdn.net/weixin_38062353/article/details/82710203

猜你喜欢

转载自blog.csdn.net/weixin_38062353/article/details/82230239
今日推荐