跳过正文
  1. 文章/
  2. Kotlin/
  3. Gradle/

1、Gradle

·4045 字·9 分钟· loading · loading · ·
Kotlin Gradle
GradyYoung
作者
GradyYoung
Gradle - 点击查看当前系列文章
§ 1、Gradle 「 当前文章 」

Gradle
#

Gradle构建工具是一个快速、可靠和适应性强的开源构建自动化工具,具有优雅和可扩展的声明性构建语言,Gradle包含许多优势:

  • Gradle是JVM平台最受欢迎的构建系统,也是Android和Kotlin多平台项目的默认选择,它拥有丰富的社区插件生态系统。
  • Gradle可以使用其内置函数、第三方插件或自定义构建逻辑自动执行各种软件构建场景。
  • Gradle提供了一种高级、声明式和富有表现力的构建语言,使阅读和编写构建逻辑变得很轻松。
  • Gradle快速、可扩展,可以构建任意规模和复杂度的项目。
  • Gradle产生可靠的结果,同时受益于增量构建、构建缓存和并行执行等优化。
  • 如果想下载Spring、SpringBoot等Spring家族的源码,基本上基于Gradle构建的

Gradle支持Android、Java、Kotlin Multiplatform、Groovy、Scala、Javascript和C/C++等热门语言的构建工作

安装
#

在开始安装之前,首先确保您已经安装好Java环境(使用java --version命令进行查看)版本不能低于Java 8

访问官方网站:https://docs.gradle.org/current/userguide/installation.html#installation

image-20250324172733695

按照官网教程下载压缩包,并配置环境变量

配置完成后,使用命令gradle -v可查看版本

image-20250324173203853

配置Gradle本地仓库
#

特别注意:这里我们接着再配置GRALE_USER_HOME环境变量:GRALE_USER_HOME相当于配置Gradle本地仓库位置和GradleWrapper缓存目录。

Gradle本地仓库可以和Maven本地仓库目录一致,但是不建议,因为两者包管理方式不一样

配置Gradle镜像
#

GRADLE_HOME下的init.d目录中创建文件:init.gradle

写入如下配置

allprojects {
    repositories { 
        mavenLocal() 
        maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" } 
        // 私服配置
        // maven {
        //     url = uri("http://your-company-repo-url/repository/maven-releases/")
        //     credentials {
        //         username = 'your-username' // 用户名
        //         password = 'your-password' // 密码
        //     }
        // }
        maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }
        mavenCentral()
	}
    
	buildscript {
		repositories { 
            maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' } 
            maven { name "Bstek" ; url 'https://nexus.bsdn.org/content/groups/public/' } 
            maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
        }
    }
}
  • allprojects:表示全局配置
    • repositories:项目需要依赖的jar包,会从repositories 指定的仓库去下载
      • mavenLocal:从本地 Maven 仓库查找依赖,需要电脑配置到Maven的环境变量,变量名为 M2_HOME
      • maven:自定义 Maven 仓库镜像
      • mavenCentral:Maven 中央仓库
    • buildscript:是给 build.gradle 使用的,即如果构建脚本本身需要一些依赖,它就会去这个指定的仓库去下载

创建Gradle项目
#

image-20250324173604099

Gradle项目目录结构
#

  • .gradle:Gradle自动生成的项目缓存目录。
  • .idea:这个是IDEA的项目配置目录,跟Gradle生成的没关系,无视掉就行。
  • app:存放整个项目的源代码、测试等,这里面就是我们写代码的地方了。
    • build.gradle.kts:项目的gradle构建脚本。
    • src:存放源代码和测试代码。
      • main:编写所有项目核心代码。
      • test:编写项目测试代码。
  • gradle:包含JAR文件和Gradle Wrapper的配置。
  • gradlew:适用于macOS和Linux的使用Gradle Wrapper执行构建的脚本(这里的版本就是GradleWrapper指定的版本)
  • gradlew.bat:适用于Windows的使用Gradle Wrapper执行构建的脚本。
  • settings.gradle.kts:定义子项目列表的项目配置文件,也是最关键的设置文件。
  • build:封装编译后的字节码、打成的包Jar、War、测试报告等信息

Gradle中的常用指令
#

命令 说明
gradle clean 清空 build 目录
gradle classes 编译业务代码和配置文件
gradle test 编译测试代码,生成测试报告
gradle build 构建项目
gradle build -x test 跳过测试构建项目

需要注意的是:gradle的指令要在含有build.gradlebuild.gradle.kts的目录执行 。

gradle 和 gradlew 的区别
#

创建一个 Gradle 项目,会发现项目目录中有gradlewgradlew.bat两个文件,那么使用这两个文件执行命令和使用gradle命令的区别如下:

gradlegradlew 都用于执行Gradle构建任务,但它们之间有一些关键区别

  • gradle

    • 系统级安装:gradle 命令需要你在系统上手动安装Gradle。这意味着你需要自己管理Gradle版本。

    • 全局配置:由于是系统级安装,所有使用 gradle 命令的项目将共享相同的Gradle版本,除非你明确地为每个项目指定不同的版本。

    • 版本冲突:如果不同的项目需要不同版本的Gradle,使用 gradle 可能会导致版本冲突。

  • gradlew(Gradle Wrapper)

    • 项目级安装:gradlew(Gradle Wrapper)是一个项目级的工具,它自动下载你项目所需的正确版本的Gradle。这意味着你不需要在系统上手动安装Gradle。

    • 版本隔离:由于每个项目都有自己的Gradle Wrapper,因此不同项目可以轻易地使用不同版本的Gradle,而不会互相影响。

    • 便于协作:使用Gradle Wrapper意味着所有开发者和CI/CD环境都将使用相同版本的Gradle,这使得构建更加可预测和可重复。

    • 自动化和便捷性:由于Gradle Wrapper自动管理Gradle版本,因此它特别适用于自动化构建和持续集成。

总结
#
  • 使用 gradlew 通常更为推荐,因为它提供了更好的版本管理和项目隔离。
  • 如果你是项目的唯一开发者,并且确定所有项目都将使用相同版本的Gradle,那么使用 gradle 也是可以的

项目配置文件
#

settings.gradle
#

配置文件settings.gradle是整个Gradle项目的入口点:

image-20240113150604473

配置文件用于定义所有的子项目,并让它们参与到构建中,Gradle支持单项目和多项目的构建:

  • 对于单个项目构建,设置文件是可选的。
  • 对于多项目构建,设置文件必须存在,并在其中定义所有子项目。

配置文件可以使用Groovy语言(名称为settings.gradle)或是Kotlin语言(名称为settings.gradle.kts)编写,后面我们一律采用Kotlin语言,设置文件通常位于项目的根目录中

一个标准的Gradle设置文件按照以下样式进行编写,这里使用Kotlin语言介绍:

rootProject.name = "root-project"   //rootProject对象代表当前这个项目,其name属性就是当前项目的名称

include("sub-project-a")     //所有的子项目使用include()函数进行添加,如果没有子项目可以不写
include("sub-project-b")
include("sub-project-c")

当找到设置文件settings.gradle(.kts)时,Gradle会实例化一个Settings对象,我们可以通过此对象来声明要包含在构建中的所有项目,包括我们项目名称的声明也是通过它来完成

settings.rootProject.name = "untitled"

//可以省略掉settings直接使用其提供的属性
rootProject.name = "untitled"

其中,Settings对象包含以下常用属性:

名称 描述
buildCache 项目构建所用缓存配置。
plugins 用于设置的插件。
rootDir 项目构建的根目录,根目录是整个项目目录最外层。
rootProject 构建的根项目。
settings 返回设置对象。

在Gradle中,和Maven一样也分为插件和依赖,我们可以在settings.gradle.kts中可以为所有的项目进行统一配置,比如要修改获取插件的仓库位置

pluginManagement {   //使用pluginManagement函数配置插件仓库列表
    repositories {   //在repositories函数中配置需要用的仓库
        gradlePluginPortal()   //Gradle插件仓库
        google()    //Google插件仓库
    }
}

我们也可以修改为国内的阿里云镜像

pluginManagement {
    repositories {
      	//手动指定maven仓库地址,修改URL地址
        maven {
            setUrl("https://maven.aliyun.com/repository/public/")
        }
    }
}

同样的,对于所有的依赖,也可以直接配置为国内的阿里云镜像仓库

dependencyResolutionManagement {   //依赖解析管理中可以配置全局依赖仓库
    repositories {  //只不过这种方式目前还在孵化阶段,可能会在未来某个版本移除
        maven {
            setUrl("https://maven.aliyun.com/repository/public/")
        }
    }
}

不过,除了在settings.gradle.kts中配置三方仓库之外,我们更推荐在build.gradle.kts中对仓库进行配置。

build.gradle
#

针对于单个项目的构建文件,其中gradle.build文件就是对应的构建配置,这里我们使用的是Kotlin语言,因此项目中会存在一个gradle.build.kts文件

plugins {
    kotlin("jvm") version "1.8.0"
    application
}

group = "top.ygang"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    testImplementation(kotlin("test"))
}

tasks.test {
    useJUnitPlatform()
}

kotlin {
    jvmToolchain(8)
}

application {
    mainClass.set("MainKt")
}

可以看到,在这个配置文件中存在大量的Lambda语句,这也使得整个配置文件写起来更加简介美观,所以说虽然Gradle依赖于JVM平台,但是仅支持Kotlin和Groovy,它们相比Java在语法上存在更大的优势,更适合编写这种类似脚本一样的配置文件。

对于设置文件中包含的每个项目,Gradle都会为其创建一个Project实例对象,我们可以直接在build.gradle.kts中使用

group = "top.ygang"
version = "1.0-SNAPSHOT"

//本质上就是project的属性
project.group = "top.ygang"   //本质上就是project的属性
project.version = "1.0-SNAPSHOT"

在此对象中,包含以下常见属性

名称 类型 描述
name String 项目目录的名称。
path String 该项目的完全限定名称。
description String 该项目的描述。
dependencies DependencyHandler 配置项目的依赖列表。
repositories RepositoryHandler 配置项目的依赖仓库。
layout ProjectLayout 通过此对象来访问项目中的关键位置。
group Object 项目的组。
version Object 项目的版本。

plugins
#

最顶上的plugins函数,后面的Lambda中编写了当前项目需要使用到的插件

一般情况下,我们普通的Java项目可以直接使用java插件,它能够直接完成编译和打包Java代码

plugins {
    id("java")
}
// 或者这样写
plugins {
    java
}

如果我们需要将项目打包为一个可执行的文件,也可以使用application插件,它包含java插件的全部功能,同样支持编译和打包Java代码,并且支持生成可执行的应用程序

plugins {
    id("application")
}

java {   //configure<JavaApplication> 也可以直接写成 java 这个扩展函数,效果一样
    targetCompatibility = JavaVersion.VERSION_17
    sourceCompatibility = JavaVersion.VERSION_17
}

application {   //同configure<JavaApplication>
    mainClass = "top.ygang.Main"  //配置主类
}

group和version
#

设置了当前项目所属的组名称和版本

group = "top.ygang"
version = "1.0-SNAPSHOT"

repositories
#

所有依赖的仓库配置,默认使用的是Maven中心仓库

repositories {
    mavenCentral()
}

tasks.test
#

任务相关配置,这里对test任务进行了相关配置

tasks.test {
    useJUnitPlatform()
}
Gradle - 点击查看当前系列文章
§ 1、Gradle 「 当前文章 」