Kotlin 与 Gradle 的安装与初步使用(2)

Kotlin 与 Gradle 的安装与初步使用(2)

前言

在上一个章节中,我们讨论了如何安装 Kotlin 和 Gradle,并使用它们来编写一个简单的 Hello World 程序。
在本章中,我想聊一下 Gradle 的核心概念,以及如何组织一个Gradle + Kotlin 项目。

目的

  1. Gradle 的工程目录是如何组织的
  2. Gradle 的核心概念与流程有哪些,与 Maven 有什么区别
  3. 如何使用 Gradle 来管理 Kotlin 项目

实际内容

Gradle 工程目录结构

基于上一章节已经创建了一个简单的 Gradle + Kotlin 项目,
我们可以查看一下这个项目的目录结构

❯ cd tutorial
❯ tree -L2
.
├── app 1️⃣
│   ├── build
│   ├── build.gradle.kts
│   └── src
├── build 2️⃣
│   └── reports
├── gradle 3️⃣
│   ├── libs.versions.toml
│   └── wrapper
├── gradle.properties 4️⃣
├── gradlew 5️⃣
├── gradlew.bat 5️⃣
├── kls_database.db 6️⃣
└── settings.gradle.kts 7️⃣

8 directories, 7 files

根据上面的目录结构,我们可以看到几个重要的目录和文件:

  1. app 目录:这是我们的应用程序代码所在的目录,包含了 build.gradle.kts 文件和 src 目录。
    我们一般就在这里写编写我们的 kotlin 代码
  2. build 目录:这是 Gradle 构建输出的目录,包含了构建生成的文件和报告。
    每次执行 gradle build 命令时,Gradle 会在这里生成构建结果
  3. gradle 目录:这是 Gradle 的配置文件和库的目录,包含了 libs.versions.toml 文件和 wrapper 目录。
    libs.versions.toml 文件用于管理依赖库的版本,wrapper 目录包含了 Gradle Wrapper 的相关文件
  4. gradle.properties 文件:这是 Gradle 的全局配置文件
  5. gradlewgradlew.bat 文件:这是 Gradle Wrapper 的脚本文件,用于在不同的操作系统上执行 Gradle 命令。\
  6. kls_database.db 文件:这是 Kotlin Language Server 的数据库文件,用于存储代码索引和其他信息, 事实上这是个 sqlite 数据库文件,
    主要用于 Kotlin Language Server 的代码索引和其他信息存储
  7. settings.gradle.kts 文件:这是 Gradle 的设置文件,用于定义项目的结构和模块

Gradle 的核心概念与流程

  1. 项目,在 Gradle 中,一个项目是一个独立的构建单元,通常对应于一个应用程序或库。
    在我们的例子中,app 目录就是一个项目
  2. 任务,Gradle 的构建过程是由一系列任务组成的,每 个任务执行特定的操作,如编译代码、运行测试、打包应用等。
    任务可以通过 build.gradle.kts 文件定义
  3. 依赖,Gradle 支持声明项目的依赖关系,可以是其他项目、库或插件。
    依赖可以在 build.gradle.kts 文件中声明,Gradle 会自动处理依赖的下载和管理
  4. 插件,Gradle 插件是扩展 Gradle 功能的模块,可以添加新的任务、配置和功能。
    插件可以在 build.gradle.kts 文件中应用,常用的插件包括 Java 插件、Kotlin 插件等
  5. 构建脚本,Gradle 的构建脚本是用 Groovy 或 Kotlin DSL 编写的,用于定义项目的构建逻辑。
    在我们的例子中,build.gradle.kts 文件就是一个构建脚本

在这里,build.gradle.kts 文件是 Gradle 的构建脚本,该文件只作用于当前项目(即 app 目录)。
我的意思是说,build.gradle.kts 文件 只定义了 当前项目的构建逻辑,而不是整个 Gradle 工程的构建逻辑。\

与之对应的,区分整个 Gradle 工程的构建逻辑的是 settings.gradle.kts 文件。\

Gradle Wrapper

在上一章节中,我们下载了 Gradle 到本机的同时,在执行 ./gradlew build 命令时,
我们同时还下载了 Gradle 在本项目的 gradle/wrapper

同时,我们还使用了 ./gradlwe run 来执行我们的 Kotlin 程序
也就是说,其实我们并没有用到我们本机的 Gradle,而是使用了项目中的 Gradle
而我们通常称项目里的 Gradle 为 Gradle Wrapper

Gradle Wrapper 是 Gradle 的一个特性,它允许我们在项目中包含一个特定版本的 Gradle。
这样,无论我们在什么环境中运行项目,都可以确保使用相同版本的 Gradle,从而避免版本不兼容的问题。

我们再把目光放到 gradle/wrapper 目录中

❯ tree -L2 ./gradle
gradle
├── libs.versions.toml 1️⃣
└── wrapper
    ├── gradle-wrapper.jar 2️⃣
    └── gradle-wrapper.properties 3️⃣

2 directories, 3 files

根据上面的目录结构,我们可以看到几个重要的文件:

  1. libs.versions.toml 文件:这是一个版本管理文件,用于定义项目中使用的依赖库的版本。
    这个文件可以帮助我们统一管理依赖库的版本,避免版本冲突
  2. gradle-wrapper.jar 文件:这是 Gradle Wrapper 的核心文件,包含了 Gradle Wrapper 的实现代码,主要用于下载正确的 Gradle 版本
  3. gradle-wrapper.properties 文件:这是 Gradle Wrapper 的配置文件,用于配置 Gradle 的下载源以及下载包

Gradle 命令使用

其实我个人感觉与 Maven 也有相似之处

首先我们看一下 Gradle 的命令行帮助信息

❯ ./gradlew --help
...
USAGE: gradlew [option...] [task...]
... 
❯ ./gradlew tasks
...

其他的都可以忽略了,只需要知道

  1. ./gradlew --help 可以查看命令的 option 信息
  2. ./gradlew tasks 可以查看可用的任务列表

根据自己的要求去弄就可以了

我想说的是,在 tasks 的使用上,有点类似于 Maven

❯ mvn clean compile test
❯ gradle clean build

主要区别在于 Maven 的生命周期是固定的,而 Gradle 的任务是可以自定义的。\

值得注意的是,Gradle 面向多个项目的时候,命令的用法会有所区别

❯ ./gradlew build
❯ ./gradlew :build

这两个用法很相似,但也存在一定的区别

  1. ./gradlew build 这个命令作用于整个 Gradle 项目,
    它会执行所有项目的 build 任务, 我的意思意思是 所有子项目都会执行该命令
  2. ./gradlew :build 这个命令作用于当前项目的 build 任务,
    它只会执行当前项目的 build 任务, 在这种情况下, 表示当前项目的根目录,也就是只对根项目执行 build 任务

而如果说我们要指定不同的子项目任务时,假设该子项目为 subproject
我们可以使用以下命令:

❯ ./gradlew :subproject:build

Settings.gradle.kts 文件

Settings.gradle.kts 文件是 Gradle 的设置文件,用于定义项目的结构和模块。也就是说 \

  1. 当我们的项目是一个单一的一个项目的时候,这个文件是一个可选项
    而当这个项目没有这个文件的时候, Gradle 会默认将当前目录作为一个单一的项目来处理
  2. 当我们的项目是个多子项目的时候,那么这个文件是必须的

让我们看一看在我们刚新建的项目中,settings.gradle.kts 文件的内容

❯ cat settings.gradle.kts
/*
 * This file was generated by the Gradle 'init' task.
 *
 * The settings file is used to specify which projects to include in your build.
 * For more detailed information on multi-project builds, please refer to https://docs.gradle.org/9.0.0-rc-4/userguide/multi_project_builds.html in the Gradle documentation.
 */

plugins {
    // Apply the foojay-resolver plugin to allow automatic download of JDKs
    id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}

rootProject.name = "tutorial" 1️⃣
include("app") 2️⃣
  1. rootProject.name = "tutorial":这行代码设置了根项目的名称为 tutorial
    这个名称会在构建输出和报告中使用
  2. include("app"):这行代码包含了一个名为 app 的子项目,
    这意味着在构建过程中,Gradle 会处理 app 目录下的 build.gradle.kts 文件,并将其作为一个子项目

当然了,这个文件除了定义子项目之外,还可以定义其他的设置,具体如图所示
这里就不多赘述了

author-gradle-7

build.gradle.kts 文件

在多项目中工程中,每个子项目都拥有自己的 build.gradle.kts 文件,
这个文件主要用于定义子项目的插件以及依赖

基于前面的项目,让我们看一想我们的 build.gradle.kts 文件的内容

❯ cat ./app/build.gradle.kts
/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Kotlin application project to get you started.
 * For more details on building Java & JVM projects, please refer to https://docs.gradle.org/9.0.0-rc-4/userguide/building_java_projects.html in the Gradle documentation.
 */

plugins { 1️⃣
    // Apply the org.jetbrains.kotlin.jvm Plugin to add support for Kotlin.
    alias(libs.plugins.kotlin.jvm)

    // Apply the application plugin to add support for building a CLI application in Java.
    application
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies { 2️⃣
    // Use the Kotlin JUnit 5 integration.
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")

    // Use the JUnit 5 integration.
    testImplementation(libs.junit.jupiter.engine)

    testRuntimeOnly("org.junit.platform:junit-platform-launcher")

    // This dependency is used by the application.
    implementation(libs.guava)
}

// Apply a specific Java toolchain to ease working on different environments.
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

application { 3️⃣
    // Define the main class for the application.
    mainClass = "org.example.AppKt"
}

tasks.named<Test>("test") {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}

  1. ‘plugins’ 用于定义项目插件
  2. ‘dependencies’ 用于定义项目的依赖
  3. ‘application’ 用于定义应用程序的主类,同行也可以用来定义项目的 tasks

Settings.gradle.kts 不同,\

  • 在作用域上,build.gradle.kts 文件是每个子项目的构建脚本,而 settings.gradle.kts 则作用于整个工程
  • 在功能上,build.gradle.kts 并不定义 pluginManagement, 而 Settings.gradle.kts 并不能定义项目的具体依赖

总结

在本章中,我们讨论了 Gradle 的核心概念和目录结构,并且对其中的文件有了初步的了解。
下一章节我想说一说如何使用 Kotlin 来编写相关的程序,简单的来实践一下

posted @ 2025-08-06 10:38  五花肉炒河粉  阅读(37)  评论(0)    收藏  举报