Gradle使用详解

现在市场上构建工具主要有三种:ant、maven、gradle。 但maven用久了之后也发现很多问题,比如纯xml配置不支持脚本语言,这在一些大型的项目比如一套源码多地部署时,需要根据场景来抽包(java工程)的情况下就显的有点力不从心了。

一、Gradle是什么?

Gradle 是一种开源构建自动化工具,可以构建几乎任何类型的语言(现支持60多种语言,并且还在持续增加中)。Gradle 对您要构建什么或如何构建它几乎没有任何假设,这使得 Gradle 特别灵活。Gradle 构建脚本可以使用 Groovy 或 Kotlin 编写,在深入了解 Gradle 的细节之前,了解以下术语会很有帮助。

1.术语

  • 项目:就是传统的项目或模块的概念,包含应用的代码和资源文件,也是Gradle 构建的对象。项目包含一个构建脚本,它是一个位于项目根目录中的文件。单次构建可以包含一个或多个项目,每个项目可以包含自己的子项目
  • 构建脚本:这是Gradle的配置文件,相当于maven的pom.xml文件,通常名为build.gradle或build.gradle.kts。构建脚本中可以定义任务、依赖项、插件以及其他配置。采用Koltlin编写的腰带的文件后缀名为.kts,采用Groovy语言编写的脚本的文件后缀名为.gradle
  • 任务:Gradle所有的工具全是通过任务方式来执行的,任务包含执行某些工作的逻辑——编译代码、运行测试或部署软件。在大多数项目中使用Gradle提供的内置任务就足够了。比如TestGradle 提供了实现许多常见构建系统需求的任务,任务本身包括:
    1. 动作:做某事的工作片段,例如复制文件或编译源代码
    2. 输入:操作使用或操作的值、文件和目录
    3. 输出:操作修改或生成的文件和目录

2.与maven区别

  • 速度:gradle使用构建缓存、守护进程等方式提高编译速度。结果就是gradle的编译速度要远超maven,平均编译速度比Maven快好几倍,而且项目越大,这个差距就越明显。
  • 灵活性:gradle要比Maven灵活太多,虽然有时候灵活并不是一件好事情。但是大部分情况下,灵活一点可以极大的方便我们。Maven死板的XML文件方式做起事情来非常麻烦。很多Maven项目都通过执行外部脚本的方式来完成一些需要灵活性的工作。而在gradle中配置文件就是构建脚本,构建脚本就是编程语言,完全可以自给自足,无需外部脚本。
  • 简洁性:gradle脚本的长度要远远短于maven配置文件的长度。虽然很多人都说XML维护起来不麻烦,但是我觉得,维护一个光是依赖就有几百行的XML文件,不见得就比gradle脚本简单。

二、安装Gradle

1.二进制文件安装方式

2.包安装方式

3.Gradle-Wrapper方式

可以称Gradle Wrapper为Gradle包装器,是将Gradle再次包装。让所有的Gradle构建方法在 Gradle 包装器的帮助下运行。目的是可以让我们不需要在本地电脑中安装 Gradle 环境也可以运行 Gradle 项目。官方建议任何 Gradle 构建方法都要在 Gradle Wrapper帮助下运行,利于多人协同开发时环境的统一

三、 Gradle全局配置

只要安装了gradle就会在本地系统的用户根目录下创建.gradle文件。
gradle的root目录存在的目的是为了方便资源共享和构建的管理,即gradle的root中的配置对所有本地的gradle应用都有效,同时每个本地的gradle应用都可以在build.gradle.kts进行配置覆盖root目录中的配置。

  • cachs\modules-2:所有依赖的jar包的缓存目录;
  • wrapper\dists:所有下载的不同版本的Gradle存放地址目录
  • init.gradle:对应的gradle init命令,主要配置一些公共资源,比如仓库、公共jar包等;
  • gradle.properties:与运行相关,可配置一些运行时参数和自定义的参数,比如jvm参数等;

1.init.gradle初始化配置

主要是配置jar文件下载时的镜像地址,需要在/Users/liudong/.gradle文件夹中新建一个init.gradle初始化脚本,这样一来,gradle下载镜像的时候就会使用这里配置的镜像源下载,速度会快很多,脚本文件内容如下:

allprojects {
   repositories {
       maven {
           url "https://maven.aliyun.com/repository/public"
       }
       maven {
           url "https://maven.aliyun.com/repository/jcenter"
       }
       maven {
           url "https://maven.aliyun.com/repository/spring"
       }
       maven {
           url "https://maven.aliyun.com/repository/spring-plugin"
       }
       maven {
           url "https://maven.aliyun.com/repository/gradle-plugin"
       }
       maven {
           url "https://maven.aliyun.com/repository/google"
       }
       maven {
           url "https://maven.aliyun.com/repository/grails-core"
       }
       maven {
           url "https://maven.aliyun.com/repository/apache-snapshots"
       }
   }
}

2.gradle.properties运行时配置

在/Users/liudong/.gradle文件夹中直接新建一个gradle.properties文件,创建内容不复杂,直接看代码即可,设置Gradle的JVM参数、代理和日志等信息,更多的设置可查看官网。

#gradle运行时的jvm设置
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
 
#gradle代理配置,按需配置即可
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=10800
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=10800
systemProp.file.encoding=UTF-8
org.gradle.warning.mode=all
 
#gradle运行时的性能配置
kotlin.incremental.useClasspathSnapshot = false
kotlin.stdlib.default.dependency = false
org.gradle.configuration-cache = true
org.gradle.caching = true
systemProp.org.gradle.unsafe.kotlin.assignment = true
 
#日志输出级别,默认为Info,如果只输出错误日志则指定quiet,命令行执行时需要指定参数-q
#./gradlew -q api:properties
org.gradle.logging.level=(quiet,warn,lifecycle,info,debug)

四、项目中的gradle配置

使用gradle.properties的项目配置文件。这个文件中的配置会自动被build.gradle.kts构建脚本引用,并通过编程的方式可以取得配置信息。一般来讲会配置与性能相关的参数,如缓存、jvm参数等。

#性能配置
kotlin.incremental.useClasspathSnapshot = false
kotlin.stdlib.default.dependency = false
org.gradle.configuration-cache = true
org.gradle.caching = true
systemProp.org.gradle.unsafe.kotlin.assignment = true

五、 build构建脚本配置

1.获取属性

在gradle中大概有以下几种属性的配置方式,如果在多个地方配置了同名的参数,则优先级从高到底如下:

  1. 命令行属性:在输入命令时通过-D附带参数,比如 $ gradle -DgradlePropertiesProp=commandLineValue–build-cache ;
  2. Gradle配置:root目录中gradle.properties文件中的配置;
  3. Project配置:项目中gradle…properties文件中的配置;
  4. 系统环境变量:比如window的环境变量和linux系统下的.bash_profile中的配置;

2.project基本配置

以下所有小节的内容代码是增量添加的关系,是在build.gradle文件中配置的

项目类型配置
标识项目的类型,类型有很多,后面在实战章节会详细讲述,此处仅以发布为带有main.class的jar程序为例,其配置如下:

plugins {
    id("application")
}
 
application {
    mainClass.set("org.korgs.Main")
}

开发语言配置

plugins {
  id("java")
}
java {
  sourceCompatibility = JavaVersion.VERSION_17
  targetCompatibility = JavaVersion.VERSION_17
}
 
tasks {
  withType<JavaCompile> {
    sourceCompatibility = "17"
    targetCompatibility = "17"
  }
 
}

打包类型配置

//jar包
plugins {
    application
}
 
application {
    mainClass.set("org.korgs.Main")
}
//war包
plugins {
    war
}
tasks.war {
    webAppDirectory.set(file("src/main/webapp"))
    from("src/rootContent") // adds a file-set to the root of the archive
    webInf { from("src/additionalWebInf") } // adds a file-set to the WEB-INF dir.
    classpath(fileTree("additionalLibs")) // adds a file-set to the WEB-INF/lib dir.
    classpath(moreLibs) // adds a configuration to the WEB-INF/lib dir.
    webXml = file("src/someWeb.xml") // copies a file to WEB-INF/web.xml
}

插件配置

plugins {
    id 'org.springframework.boot' version '2.7.4'
    id 'java'
}

因为java是核心插件,所以不用指定版本,而其它的插件比如org.springframework.boot是社区插件,必须指定版本。
仓库配置
gradle仓库可以直接使用maven的仓库,但是gradle下载的jar包文件格式与maven不一样,所以不能和maven本地仓库共用,仓库的配置如下:

repositories {
     mavenLocal() //本地仓库
     maven { url 'http://maven.aliyun.com/nexus/content/groups/public' } //外部仓库(阿里云)
     mavenCentral() // maven 中心仓库
}

jar依赖配置
gradle依赖写在代码块中,遵循​​scope(gropId:artifactId:version)​格式。

dependencies {
    testImplementation('junit:junit:4.13')
    implementation('org.projectlombok:lombok:1.18.26')
    implementation('mysql:mysql-connector-java:8.0.32')
}

Scope说明:maven只有compile、provided、test、runtime,而gradle有以下几种scope:

  • implementation:默认的scope,会将指定的依赖添加到编译路径,并且会将该依赖打包到输出,但是这个依赖在编译时不能暴露给其他模块,例如如果我们的类库包含了gson,那么其他人使用我们的类库时,编译时不会出现gson的依赖。
  • api:api关键字是由java-library提供,若要使用,请在plugins中添加:​​id 'java-library’​​== (在旧版本中作用与compile相同,新版本移除了compile)使用api配置的依赖会将对应的依赖添加到编译路径,并将依赖打包输出,但是这个依赖是可以传递的,比如模块A依赖模块B,B依赖库C,模块B在编译时能够访问到库C,但是与implemetation不同的是,在模块A中库C也是可以访问的。
  • compileOnly:compileOnly修饰的依赖会添加到编译路径中,但是不会被打包,因此只能在编译时访问,且compileOnly修饰的依赖不会传递。
  • runtimeOnly:这个与compileOnly相反,它修饰的依赖不会添加到编译路径中,但是能被打包,在运行时使用。和Maven的provided比较接近。
  • annotationProcessor:用于注解处理器的依赖配置。
  • testImplementation:这种依赖在测试编译时和运行时可见,类似于Maven的test作用域。
  • testCompileOnlytestRuntimeOnly:这两种类似于compileOnly和runtimeOnly,但是作用于测试编译时和运行时。
  • classpath:见上一段,classpath并不能在buildscript外的dependcies中使用

四、Gradle生命周期

说到任务不得不提一下Gradle的生命周期,简单来讲。Gradle 构建的生命周期主要分为三个阶段,Initialization,Configuration,Execution。

  • Initialization:Gradle支持单个或多个工程的构建。在Initialization阶段,Gradle决定哪些工程将参与到当前构建过程,并为每一个这样的工程创建一个Project实例。一般情况下,参与构建的工程信息将在settings.gradle中定义。
  • Configuration:在这一阶段,配置project的实例。所有工程的构建脚本都将被执行。Task,configuration和许多其他的对象将被创建和配置。
  • Execution:在之前的configuration阶段,task的一个子集被创建并配置。这些子集来自于作为参数传入gradle命令的task名字,在execution阶段,这一子集将被依次执行。

五、Gradle的Task

在Gradle中,Task是一种最小的工作单元,用于完成构建过程中的某个具体任务,例如编译源代码、运行测试、打包应用等。每个Task都有一个唯一的名字,并且可以接受一组输入和输出。
通常情况下,一个Gradle项目会包含多个Task,这些Task之间存在着依赖关系。用户可以通过执行特定的Task或一系列Task来完成整个构建过程。
用户可以根据实际需求定义自己的Task,也可以利用已经存在的Task,从而实现高度灵活的自动化构建流程。

  • assemble: 这个Task主要用于构建所有指定的目标构件(如APKs, JARs等)。
  • check: 这个Task主要用于运行所有的检查,包括编译器检查、静态分析、单元测试等。
  • clean: 这个Task主要用于清理构建结果,如删除生成的JAR文件或APK文件。
  • dependencies: 这个Task主要用于显示项目的依赖关系。
  • build: 这个Task是默认的Task,它的功能通常是assemble和check的组合。
    eg. rebuild的话使用clean和build来进行;在终端命令行可以使用如下命令:
./gradlew clean
./gradlew build

参考文献:

https://blog.csdn.net/liudonglovehemin/article/details/130980784

你可能感兴趣的:(gradle,android)