Gradle教程「建议收藏」

2022-09-14 17:28:55 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

1.简介

在本课程中,我们将学习Gradle ,它是一个构建工具和一个依赖管理系统,与Maven和Ant非常相似,并且是专门为构建基于Java的项目而设计的。

与Maven和Ant构建系统不同,Gradle不使用XML。 它实际上是基于Groovy构建在DSL中的。 与基于XML的其他构建系统相比,基于Groovy的Gradle脚本的最大优势是可以使构建脚本更小,更简洁。 就像Maven构建文件称为pom.xml ,Gradle的配置文件build.gradle惯例也称为build.gradle 。 在本课程中,我们将研究Gradle的核心概念,并建立一个基于Spring Boot的简单项目。 即使您不是Spring Developer,您仍然可以按照定义课程的方式进行操作,这样框架就不会在您学习Gradle概念时引入任何障碍。 让我们开始行动吧!

目录

1.简介 2. Gradle核心概念 3.安装Gradle 4.设置示例项目 5.运行摇篮 5.1运行任务 5.2运行多个任务 5.3任务名称缩写 5.4排除任务 5.5安静模式 5.6列出构建脚本中的任务 5.7明确指定构建脚本 5.8指定项目 5.9列出子项目 5.10 Gradle帮助

6.定义和使用Gradle任务 6.1定义Gradle任务 6.2任务执行阶段 6.3任务定义的较短语法

7.始终在安静模式下运行Gradle 8.扩展Java Spring Boot项目 8.1定义控制器 8.2使用Gradle运行项目 8.3试用API

9.摇篮包装 10.蚂蚁vs Maven vs Gradle 11.结论 12.下载源代码

2. Gradle核心概念

Gradle构建系统背后的核心概念可以归纳为三个主要功能。 他们是:

  1. 项目:您要构建的软件
  2. 任务:这些是实际构建项目的动作
  3. 构建脚本:这是包含构建项目的任务的脚本

要了解它们之间的关系,让我们一起研究它们。 因此,一个项目就是您要构建的东西。 任务是构建项目的动作。 具体来说,可能存在编译源代码的任务,从而生成可执行文件,如WAR或JAR文件。 基于Gradle的项目可以包含许多任务以执行以构建项目。

这些任务在构建脚本文件中定义 ,可以由Gradle执行以按指定顺序运行每个任务。 甚至可以使用gradle命令选择特定任务以仅运行指定任务。 这些任务在项目根目录中的build.script文件中定义。 通常,一个项目只有一个构建文件

3.安装Gradle

在开始使用Gradle命令并开始定义Gradle任务之前,我们必须在系统上安装Gradle。 请注意,Gradle需要运行JDK 6或更高版本。 Gradle将使用在系统的PATH环境中找到的Java JDK作为JAVA_HOME 。 如果您想要的Java版本与实际使用的版本不同,只需将JAVA_HOME环境变量指向该Java版本,Gradle将开始使用它。 您可以使用以下简单命令确保在系统上安装了Java:

检查Java版本

代码语言:javascript复制
java -version

您应该会看到以下内容:

检查java版本

确认Java版本后, 下载要安装的Gradle版本,然后将其解压缩到要安装Gradle的目录中。将Gradle解压缩到安装目录中后,将DIRECTCRY_PATH/bin添加到PATH环境变量中。 添加路径的DIRECTCRY_PATH部分必须是Gradle安装目录的完整路径(而不是“ DIRECTCRY_PATH”作为文本)。 完成此操作后,我们可以使用以下命令以与Java相同的方式检查Gradle版本:

检查Gradle版本

代码语言:javascript复制
gradle -version

您应该会看到以下内容:

摇篮版本

即使我们已经安装了Gradle,即使您没有安装Gradle并按照下一节中的描述制作示例项目,也可以按照本课程进行操作。 gradle构建脚本将独立包含在该项目中,并且不需要在系统本身上显式安装Gradle。 那不是很好吗?

4.设置样本项目

在本课中,我们将使用最流行的Web工具之一来制作示例项目,并且不会从命令行执行它,而是使用Spring Initializr 。 只需在浏览器中打开链接并进行浏览即可。 要设置我们的项目,我们使用以下配置:

Spring Initializr配置

如图所示,我们添加了一个依赖关系,但这并不重要。 解压缩该项目,并在您喜欢的任何文本编辑器中打开存在于项目根目录中的build.gradle文件。 对于此项目,文件将如下所示:

build.gradle

代码语言:javascript复制
buildscript {
	ext {
		springBootVersion = '2.0.1.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.javacodegeeks.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
	mavenCentral()
}

dependencies {
	compile('org.springframework.boot:spring-boot-starter-web')
	testCompile('org.springframework.boot:spring-boot-starter-test')
}

在上面的脚本文件中,我们看到在文件中指定了一些插件。 我们使用的第一个插件是Java插件。 该插件提供了一些预定义的配置和任务,使我们能够非常轻松地构建Java项目。 它利用类似Maven的源集在指定项目中查找源代码。

Source-Set定义为一种配置,它通知插件在哪里寻找用于编译和测试任务的源代码。 默认情况下,Java源代码位于src / main / java下 ,而测试包位于src / test / java下 。 除非另有说明,否则将在相同目录中搜索源代码。

除了插件之外,我们还向项目添加了一些依赖项 。 Gradle知道从我们定义的存储库部分中寻找这些依赖项的位置。 我们指定对于任何依赖关系解决方案,Gradle应该引用Maven中央存储库来下载运行项目所需的任何所需JAR。

5.运行摇篮

打开命令行终端,然后切换到项目的根目录。 由于该项目基于Gradle,并且我们也在系统上安装了Gradle,因此我们现在可以运行Gradle。 让我们看看如何做到这一点:

跑步摇篮

代码语言:javascript复制
gradle

这将在项目根目录中存在的build.gradle文件上运行Gradle。

5.1运行任务

Gradle构建脚本包含一个或多个我们可以执行的任务。 我们可以通过简单地将任务名称放在gradle命令之后来在项目上执行任务:

运行单个任务

代码语言:javascript复制
gradle compileCode

上面的命令将触发上述任务,以编译项目代码。 如前所述,由于构建文件中存在适当的Java插件,因此Gradle将能够找到项目的源代码。

5.2运行多个任务

就像我们在上一节中将任务名称放在gradle命令之后执行单个任务一样,我们甚至可以一次执行多个任务以指定顺序执行它们。 让我们看看如何做到这一点:

运行多个任务

代码语言:javascript复制
gradle clean build

该命令将首先执行clean任务。 该任务完成后,将自动触发install任务。 一旦运行此命令,我们将看到类似以下内容:

执行多项任务

为了说明这一点,即使您多次提及同一任务,该任务也只会执行一次。 就像下面的命令:

运行多个任务

代码语言:javascript复制
gradle clean clean

即使多次提到clean任务,它也只会执行一次,不会执行两次。

5.3任务名称缩写

不必键入完整的任务名称即可执行它。 就像,对于clean任务,我们可以这样写:

任务缩写

代码语言:javascript复制
gradle c

如果名称与其他任务没有冲突,则gradle将查找干净任务并执行。 当我们运行它时,它失败了,因为有多个任务以字符c开始:

任务缩写

该错误清楚地表明可能的候选对象是:“检查”,“类”,“干净”,“组件”。 因此,在这种情况下,我们需要更加具体。 但是,以下命令将正常运行:

任务缩写

代码语言:javascript复制
gradle cle

这将执行clean任务。 这样,Gradle提供了一种对开发人员友好的方式,即使提供了便利的约定和命令行实用程序,我们也不必手动缩短命令。

5.4排除任务

有些Gradle任务也依赖于其他任务。 因此,当您执行主要任务时,它将触发执行它所依赖的所有任务。 尽管这不会造成任何问题,但是会减慢构建过程。 考虑一种情况,当您想要执行构建任务时。 它也会触发testtestClasses任务,但是您知道test任务将在您测试所有测试用例时成功完成,因此您可能想忽略它以加快过程。 可以使用-x开关来完成,如下所示:

忽略任务

代码语言:javascript复制
gradle build -x test

5.5安静模式

执行任务时,Gradle将大量消息输出到控制台。 如果您希望执行一些安静的任务,可以使用如图所示的-q开关来安静地执行任务,而不会产生控制台消息:

静音模式

代码语言:javascript复制
gradle -q compileCode

当您编写脚本以使用自动生成和部署文件或代码管道来部署项目时,安静模式非常有用。 这样,在gradle任务执行过程中不会在日志文件中填充不必要的日志消息。

5.6列出构建脚本中的任务

当我们要列出构建脚本中显示的所有任务时,我们可以简单地运行以下命令:

列出所有任务

代码语言:javascript复制
gradle tasks

对于我们的项目,我们将看到已经定义了许多任务:

列出所有可用的Gradle任务

我们看到与每个任务有关的信息。 这提供了一种便捷的方式,使我们可以获取有关脚本中定义的插件中预定义的每个任务的信息。

5.7明确指定构建脚本

即使Gradle自动在项目的根目录中选择默认的build.gradle文件,但如果您想以其他方式命名该文件,则可以在gradle名称中提供一个名称,以供您选择要用作配置文件的文件借助-b开关:

pom.xml

代码语言:javascript复制
gradle -b build.gradle build

5.8指定项目

如果要构建的项目包含要以独立模式构建的子项目,则甚至可以使用-p选项指定要执行的项目:

执行子项目

代码语言:javascript复制
gradle -p subproject-directory build

5.9列出子项目

我们可以用一个简单的命令列出主项目中包含的所有子项目(在该项目的Gradle构建脚本中指定):

列出子项目

代码语言:javascript复制
gradle projects

当您查看公共项目并想确定项目中包括所有子项目时,此命令非常有用。

5.10 Gradle帮助

如果您需要与任何gradle命令和任务有关的帮助,我们可以运行一个简单的命令来获取有关可以执行的各种任务和命令的信息:

pom.xml

代码语言:javascript复制
gradle -h

我们将提供Gradle命令的选项的详细列表:

摇篮帮助

6.定义和使用Gradle任务

Gradle任务定义了构建项目所需的操作。 没有任务,我们的构建脚本将不会在Gradle执行时构建任何内容。 现在,我们将看到如何在上面已经定义的项目中完成自己的任务。

6.1定义Gradle任务

让我们在build.gradle文件中定义一个新的Gradle Task,如下所示:

build.gradle

代码语言:javascript复制
task hello { 
    println "Hello, JavaCodeGeeks." 
}

我们可以执行定义为的任务:

运行我们的任务

代码语言:javascript复制
gradle hello

我们将看到输出为:

在Gradle中运行我们自己的任务

6.2任务执行阶段

执行Gradle任务时,它将经过两个执行阶段,然后评估结果。 这些阶段是:

  • 第一
  • 持续

在内部,Gradle任务表示为一个对象。 要开始执行第一阶段,我们必须调用已定义的方法之一,将闭包作为参数传递(闭包是匿名函数)。 各自的构建阶段方法是:

  • doFirst()
  • doLast()

让我们看一个有关如何在任务中调用这两个方法的示例:

调用阶段方法

代码语言:javascript复制
task hello

hello.doFirst({
	println "First method"
});

hello.doLast({
	println "Last method"
});

当我们使用命令执行这些方法时:

运行我们的任务

代码语言:javascript复制
gradle hello

我们将看到输出为:

运行分阶段任务

如前所述,我们首先定义了一个名为hello的任务。 接下来,我们定义并调用doFirst()方法,并传递一个闭包作为包含打印语句的参数。 类似地定义了下一个方法doLast() ,该方法本质上执行相同的操作。 运行任务时,我们可以看到这两个方法以相同的顺序被调用。

6.3任务定义的较短语法

使用Groovy,优化代码的可能性比其他语言要高得多。 我们在上一节中编写的分阶段任务定义中也可以做到这一点。 这是我们可以对定义的代码执行的改进:

  • 如果带有方法调用的代码行以新行结尾,则无需在每个方法定义的末尾使用分号。
  • 由于闭包是匿名函数,因此我们不需要闭包中存在的语句周围的括号。

通过这些优化,我们的代码将如下所示:

调用阶段方法

代码语言:javascript复制
task hello

hello.doFirst{
	println "First method"
}

hello.doLast{
	println "Last method"
}

当然,此执行阶段的输出将与之前相同。 您通常会在Gradle官方文档和其他Gradle教程中经常看到较短的语法,因为它更加直接和简洁。

7.始终在安静模式下运行Gradle

开始构建后,当前无法在安静模式下运行Gradle。 我们可以找到当前值,但是在执行任何代码时它是只读的。

的LogLevel可以通过由它的脚本gradle这个对象来访问startParamater

获取Gradle日志级别

代码语言:javascript复制
LogLevel level = gradle.startParameter.logLevel
println "Current logging level: $level"

如果我们想让日志记录不总是发送到控制台,则可以使用Gradle的内置记录器:

仅在INFO上打印

代码语言:javascript复制
project.logger.info("This gets printed only if caller uses --info flag on command line.")

然后,对于我们的事件,我们希望控制台记录器使用lifecycle级别:

消息总是打印

代码语言:javascript复制
project.logger.lifecycle('my message that will always print')

8.扩展Java Spring Boot项目

在本节中,我们将在所建立的项目中添加少量Java代码,并了解如何使用项目本身随附的构建脚本和Gradle包装器来运行它。 如果在您喜欢的IDE中打开项目,您将看到它仅包含一个带有以下代码的类:

JcgGradleTutorialApplication.java

代码语言:javascript复制
package com.javacodegeeks.example.JCGGradleTutorial;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class JcgGradleTutorialApplication {

	public static void main(String[] args) {
		SpringApplication.run(JcgGradleTutorialApplication.class, args);
	}
}

我们将在下一部分中修改此类,以使其成为成熟的Spring Boot项目。

8.1定义控制器

我们将在上面定义的类中进行小的修改,以将其转变为成熟的Spring Boot控制器类,以便我们也向其中定义API。 这是我们将使用的代码:

JcgGradleTutorialApplication.java

代码语言:javascript复制
package com.javacodegeeks.example.JCGGradleTutorial;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class JcgGradleTutorialApplication {

  public static void main(String[] args) {
    SpringApplication.run(JcgGradleTutorialApplication.class, args);
  }

  @RequestMapping(value = "")
  public String helloWorld() {
    return "Hello Java Geek!";
  }
}

现在,控制器已准备就绪,我们可以继续运行项目。 另外,为了更深入地了解Sprint Boot项目和Controllers的工作方式,请阅读Spring Boot Tutorial 。

8.2使用Gradle运行项目

我们下载的项目带有Gradle包装器。 该包装器包含Gradle脚本,即使没有在我们运行项目的系统中安装Gradle,也可以使用这些脚本来运行项目。 我们可以使用以下命令运行项目:

运行项目

代码语言:javascript复制
./gradlew spring-boot:run

请注意,在运行项目之前,请删除我们定义的任务,因为它可能会更改其他任务,并且您可能无法运行该项目。 完成此操作后,我们可以尝试下一节中刚刚制作的API。

8.3试用API

项目启动并运行后,请访问以下URL:

项目网址

代码语言:javascript复制
localhost:8080

我们将看到以下消息:

运行项目

优秀的! 使用一个命令,我们就能用几行代码运行定义的完整Spring引导项目。

9.摇篮包装

为了轻松执行项目,Gradle还提供了包装器,这样我们就不必在安装和运行基于Gradle构建系统构建的项目的每台机器上都安装Gradle。 就像我们上面定义的项目一样,它包含一些文件,这些文件是适用于各种操作系统的Gradle包装器,例如:

  • gradlew是执行Gradle任务的Shell脚本文件
  • gradlew.bat 文件是执行Gradle任务的Windows批处理脚本
  • ./gradle是一个目录,其中包含Gradle包装器JAR和一个属性文件,指示我们正在使用的版本和其他配置。 这个明确的版本定义确保对Gradle的任何更新都不会破坏该项目

要使用Gradle包装文件运行项目,如果使用Linux / OSX,则运行gradlew文件;如果使用Windows OS,则运行gradlew.bat文件。 Gradle包装器提供的另一个advantageGradle是,如果要切换到较新版本的Gradle,只需更改gradle-wrapper.properties的条目。

10.蚂蚁vs Maven vs Gradle

整个行业使用的三种最受欢迎​​的构建系统是Ant,Maven和Gradle。 在比较这些系统时,每个系统各有优缺点。 让我们对这些系统中的每一个进行快速检查,以查看电源所在。

蚂蚁于2000年发布,易于学习和实施。 它遵循XML脚本格式,但明显的缺点是XML本质上是分层的,因此不适合过程编程方法。 此外,即使项目相对较小,带有Ant的XML文件也往往会变大。

Maven于2004年问世,它对ANT进行了重大改进,但它继续为其脚本使用XML格式。 增加的最大优点是能够通过网络下载所需的依赖项 。 社区感到,目标目标的自定义仍然很困难,并且当同一库以不同版本多次下载时,依赖项管理不能很好地处理冲突

Gradle于2012年发布,当Google将其用作Android OS的默认构建工具时,它获得了很大的吸引力。 Gradle不使用XML。 相反,它具有基于Groovy(JVM语言之一)的自己的DSL。 结果,Gradle构建脚本往往比为Ant或Maven编写的脚本更短,更清晰。 由于其自身的依赖关系解析引擎的存在以及多年来的巨大改进,其构建变得比Maven和Ant 更快

11.结论

在本课程中,我们研究了Gradle如何成为用于Java项目的最受欢迎和易于使用的构建系统和依赖性管理系统之一。 Gradle提供的Easy想法仅是为与领域相关的项目专门定义的,这就是为什么它为我们提供了定义构建脚本的强大功能的原因,这些构建脚本尺寸很小,并且可以用很少的Groovy代码行执行很多操作在里面。

我们还将Gradle与其他应对Gradle挑战的构建系统(Maven和Ant)进行了比较。 每个提到的构建系统都有各自的优缺点,但是Gradle脚本的简洁性使其可以在生产级系统上走很长一段路。

12.下载源代码

这是Gradle和Task定义的示例。

下载 您可以在此处下载此示例的完整源代码: JCG-Gradle-Tutorial

翻译自: https://www.javacodegeeks.com/2018/05/gradle-tutorial.html

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154125.html原文链接:https://javaforall.cn

0 人点赞