JavaRush /Java 博客 /Random-ZH /Gradle 快速简介
Viacheslav
第 3 级

Gradle 快速简介

已在 Random-ZH 群组中发布

介绍

本次评测的主题是 Gradle 自动构建系统。在英语中,构建系统称为Build ToolsGradle 快速介绍 - 1为什么这是必要的?在 Java 中手动构建项目是一个相当耗费人力的过程。需要正确指出项目需要的以及项目所依赖的库和框架。在这里您可以阅读一篇关于 Habré 的优秀文章:“在命令行上使用 Java ”。迟早您将开始创建一些脚本来自动化此过程。现在想象一下,世界各地的所有开发人员都这样做,并且每个人都重新编写某人已经为他们的项目编写的内容。然后出现了项目组装系统,使这个过程自动化。此外,一方面,它们允许您按照自己想要的方式组装项目,另一方面,它们为您提供或多或少标准化的工具。Gradle 的替代方案是 Maven 自动构建系统。一方面,这两种装配系统不同,但另一方面,它们也有许多相似之处。Gradle 网站上有关于此主题的材料:“从 Maven 迁移到 Gradle ”。正如本教程所述,Gradle 和 Maven 对于如何构建项目有不同的看法。Gradle 基于任务图,任务可以相互依赖。任务执行某种工作。Maven 使用某些阶段的模型,并附加某些“目标”。这些目标是完成一些工作的地方。然而,通过这些不同的方法,两个构建系统都遵循相同的约定,并且依赖关系管理也相似。要开始使用 Gradle,您需要下载它。在 Google 或 Yandex 中,我们输入“Gradle Build Tool”,在第一个结果中我们看到官方网站: https: //gradle.org。在 Gradle 主页面上有一个带有文本“Docs”的链接,可指向Gradle 文档。首先,我们需要安装(Install)Gradle,因此我们对文档的“安装 Gradle ”部分感兴趣。安装方法有很多种,包括“老式”方法,即 手动(“手动安装”)。根据说明,下载“仅二进制”类型的文件,该文件的名称类似于 gradle-5.1.1-bin.zip。接下来,解压存档并根据说明配置 PATH 环境变量。最主要的是,执行指令后,命令gradle -v会显示已安装的Gradle的版本。可能存在一个问题,在确定位置时,系统会发现Gradle不是你想要的位置。因此,在 Windows 上您可以执行以下操作(在 *nix 上有类似的操作): for %i in (gradle.bat) do @echo. %~$PATH:i 现在,也许我们可以开始熟悉了。
Gradle 快速介绍 - 2

初始化 Gradle 项目

我想立即指出,Gradle 是关于执行称为任务的任务我将称其为任务)。任务由各种插件提供。我建议您阅读官方文档中有关插件的更多信息:“ Using Gradle Plugins ”。安装 Gradle 后,有一组始终可用的“核心插件”。这些插件有不同的类别,但我们对“实用程序”类别感兴趣。该套件包括“ Build Init Plugin ”插件,它提供初始化 Gradle 项目的任务。我们有兴趣创建一个项目类型:“ java-application ”。让我们运行 Gradle 任务: gradle init --type java-application 让我们回答一些问题,例如,我们想要使用 Groovy DSL(Gradle 的标准任务描述语言)和 JUnit 测试框架(我们将在另一篇评论中讨论这个问题)。创建后我们将收到以下一组文件:
Gradle 快速介绍 - 3
首先,初始化后,我们收到一个为我们的 Gradle 版本预先配置的特殊包装器 - 这是一个特殊的脚本。我建议您阅读官方文档 - “ The Gradle Wrapper ”,了解更多相关信息。其次,我们看到 Gradle 构建脚本 - build.gradle 文件。这是主文件,它描述了我们的项目使用了哪些库和框架,需要将哪些插件连接到项目并描述了各种任务。我建议您在官方文档中阅读有关此文件的更多信息:“ Build Script Basics ”。
Gradle 快速介绍 - 4

插件和任务

如果我们现在查看构建脚本的内容,我们将看到插件部分:
plugins {
    id 'java'
    id 'application'
}
这些插件与我们之前讨论过的插件相同。如果有插件,那么我们现在就可以完成一些任务。我们可以运行 gradletasks 命令并查看现在可以对项目执行哪些操作:
Gradle 快速介绍 - 5
例如,通过执行gradle run我们将启动 java 应用程序的主类:
Gradle 快速介绍 - 6
我们可以看到,下面也是这样写的,2 actionable tasks: 1 executed, 1 up-to-date 这是什么意思呢?这意味着总共完成了2个任务:而且,实际上完成了1个,还有一个没有执行,因为…… 它是最新的,即状态是当前的并且尚未执行任何操作。我们可以执行所谓的“Dry Run”:gradle run -m 让我们执行这个命令,我们会看看执行run任务会执行哪些任务:
Gradle 快速介绍 - 7
我们可以看到,总共完成了4个任务:在执行run之前,它执行了依赖任务类。这些类本身有2个依赖项,因此它还执行compileJava和processResources。当我们执行一项任务时,我们可以在执行该任务的同时查看一定级别的日志(日志记录级别决定了我们希望看到的消息的重要程度)。例如,我们可以这样做gradle run -i。这还将向我们显示信息消息,例如:
Task :classes UP-TO-DATE
Skipping task ':classes' as it has no actions.
有关Gradle登录的更多信息,我建议您参考官方文档:“ Gradle Logging ”。正如我们所看到的,类任务被跳过,因为它是UP-TO-DATE 的,也就是说,状态是当前的,不需要执行任何操作,因此没有任何操作。这是因为默认情况下 Gradle 具有“最新检查”或所谓的增量构建。您可以在 Gradle 文档中阅读有关此机制的更多信息:“最新检查(又名增量构建) ”。但是可以通过执行指定 --rerun-tasks 标志的任务来禁用此机制。例如,gradle run --rerun-tasks。然后我们会看到:2 个可操作任务: 2 个已执行 如您所见,已执行任务的数量只考虑了图的第一层,即运行任务本身以及它直接依赖的那些任务,即、 类。类所依赖的任务这里不计算在内(尽管它们是在执行类任务时执行的)。您还应该阅读有关任务的信息:
Gradle 快速介绍 - 8

依赖关系

任何构建系统的主要任务之一是管理依赖关系,即我们的项目需要哪些库/框架。构建系统必须确保它们在正确的时间可用,并以正确的方式组装应用程序的最终工件。默认情况下,在 java-application 的 gradle init 之后,我们将在构建脚本中看到以下内容:
dependencies {
    implementation 'com.google.guava:guava:26.0-jre'
    testImplementation 'junit:junit:4.12'
}
在这里,我们所连接的内容一目了然。但没有一些了解,就不清楚implementation和testImplementation是什么?这里我们需要再次转向Gradle文档,因为Gradle的文档写得很好。它称为“管理依赖项配置”。如文档中所述,每个依赖项都是在特定范围内声明的 - 该依赖项在该范围内可用。该范围由某些配置指定,每个配置都有唯一的名称。同样有趣的是,许多 Gradle 插件添加了预定义的配置。要了解我们可以运行哪些配置: gradle --console plain dependencies 这样我们将看到所有可用配置及其依赖项的列表。我们可以过滤此列表,以便只看到可用的配置本身: gradle --console plain dependencies | find " - " 我们如何知道要使用什么?你必须在这里做一点阅读。因为 我们使用“Java”插件,所以让我们从它的文档和“依赖管理”部分开始。在这里我们看到曾经有一个配置(又名作用域)称为“compile”,它的意思是“编译期间需要的依赖项”。但后来它被实施所取代(英语为Superseded)。您可以在“ API 和实现分离”部分中阅读有关替换的更多信息。事实证明,这种依赖关系将位于“编译类路径”上。但有时我们希望我们的依赖项包含在最终的工件中。为了什么?例如,我们将有一个可执行的 jar,它本身应该包含所有必需的内容。那我们该怎么办呢?首先,不存在“开箱即用”的支持(即默认情况下,无需任何其他操作)。这是因为每个人都想以自己的方式收集档案,而 Gradle 试图做到极简。我们也不能在类路径上使用 jar 档案(无需在代码中进行额外的操作),因为 它不会那样工作(有关更多详细信息,请参阅“ Oracle:将类添加到 JAR 文件的类路径”)。因此,最漂亮的方式是构建脚本中的以下代码:
jar {
    manifest {
        attributes 'Main-Class': 'jrgradle.App'
    }
    from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
在 jar 任务设置中,我们指定将添加到 jar 文件清单中的内容(请参阅“ Oracle:设置应用程序的入口点”)。然后我们说编译所需的所有依赖项都将包含在 jar 中。另一种方法是使用“ Gradle Shadow Plugin ”。它可能看起来很复杂,但其他插件可以让生活变得更轻松。例如,当创建一个 Web 应用程序(而不是常规运行的 java 应用程序)时,我们将使用一个特殊的插件 - “ Gradle War Plugin ”,它具有不同的行为,我们的生活会更轻松(所有必要的依赖项都会由插件本身放在一个单独的特殊目录中。此类工作由 Web 应用程序的设计方式来规范。但这是一个完全不同的故事)。
Gradle 快速介绍 - 9

结果

Gradle是项目构建系统的绝佳选择。Spring 和 Hibernate 等知名项目的开发人员都在使用它,这一事实证实了这一点。上面只讨论了最基本的事情。它们的背后隐藏着开发人员拥有的数百万个功能和机会。Gradle 还支持创建多模块项目,这不在本次评论中,但 Gradle 本身有一个很棒的教程:“创建多项目构建”。我希望这篇评论也表明 Gradle 的文档是在 5+ 级别编写的,如果您了解在哪里查找,您可以轻松找到您需要的内容。当你了解基础知识时,这就会发生。此外,Gradle 有很棒的教程。最后我想列出一个小清单,列出您可以使用 Gradle 看到的其他内容:
Gradle 快速介绍 - 10
#维亚切斯拉夫
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION