20分钟快速入门Gradle

Posted 爪哇-毛毛虫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20分钟快速入门Gradle相关的知识,希望对你有一定的参考价值。

文章目录

一、初识Gradle

1.1 什么是Gradle

Gradle是一种自动化构建工具,用于编译、测试、打包和部署应用程序。它是一种基于Groovy语言和Kotlin语言的构建工具,提供了很多优秀的特性,例如:灵活的构建脚本、缓存机制、自动化依赖解析、多项目构建、增量构建、多种构建插件等。



`Gradle`的构建脚本使用`Groovy`或`Kotlin`语言编写,使得用户可以使用面向对象的方式描述项目的构建过程。构建脚本是`Gradle`的核心,它提供了强大的编程能力,使得开发人员可以自定义构建过程,并且与项目代码深度集成。

Gradle的依赖管理机制非常强大,它支持Maven依赖管理系统,并且可以从远程仓库自动下载和解析依赖项。它可以处理复杂的依赖关系,并且支持动态版本控制和自定义仓库。

Gradle还提供了插件机制,它可以集成其他构建工具和开发工具,例如:Java插件、android插件、Eclipse插件、IntelliJ IDEA插件等,使得用户可以轻松地进行项目开发和构建。

Gradle是一种强大而灵活的构建工具,它可以满足各种项目的构建需求,帮助开发人员提高工作效率和代码质量。

1.2 Gradle和Maven的异同

GradleMaven都是用于构建和管理Java项目的工具。




它们之间的异同如下:

  1. 相同点:
  • GradleMaven都可以用于构建和管理Java项目,以及管理项目依赖关系。
  • 它们都使用了基于插件的架构,允许用户通过配置插件来实现不同的功能。
  • GradleMaven都可以自动下载和管理项目依赖项,并将它们添加到构建路径中。
  • 它们都支持跨平台运行,可以在WindowsLinuxmacOS等操作系统上运行。

不同点:

  • Gradle使用基于GroovyKotlinDSL语言来定义构建脚本,而Maven使用基于XMLPOM文件来定义项目和构建配置。
  • Gradle的构建脚本更加灵活和可读性更好,支持自定义任务和插件,也可以使用Java代码来编写构建逻辑。而MavenPOM文件虽然规范化,但不如Gradle灵活。
  • Gradle的构建速度通常比Maven更快,因为它使用增量构建和缓存构建结果等优化策略,能够更快地处理复杂的构建逻辑。
  • Gradle可以处理更多类型的项目,包括JavaGroovyKotlinScalaAndroid等,而Maven主要用于Java项目。
  • Gradle的学习曲线可能比Maven陡峭一些,但一旦掌握了其基本概念和语法,就可以更灵活地处理复杂的构建任务。

总结:选择Gradle还是Maven,取决于项目的具体需求和个人偏好。

二、Gradle常用命令

  1. gradle build:

该指令用于编译项目并生成可执行文件。Gradle会执行项目的所有构建任务,并在完成后生成可执行文件。如果构建成功,生成的文件会被保存在项目的build目录下。

  1. gradle clean:

该指令用于删除构建目录。Gradle会删除项目的 build 目录和其他临时文件。这样可以确保每次构建都是从头开始,而不会受到以前构建的影响。

  1. gradle test:

该指令用于运行项目的测试。Gradle会执行项目的测试任务,并输出测试结果。如果所有测试都通过,则Gradle将返回成功代码。

  1. gradle tasks:

该指令用于列出可用的构建任务。Gradle会输出项目中定义的所有任务,以及它们之间的依赖关系。这个指令对于查看项目中可用的任务非常有用。

  1. gradle dependencies:

该指令用于列出项目的依赖项。Gradle会输出项目的所有依赖项,包括其名称、版本和其它详细信息。

  1. gradle assemble:

该指令用于将项目打包成一个归档文件。Gradle会执行项目的打包任务,并将结果保存到项目的 build 目录下。这个指令对于将项目打包成一个可部署文件非常有用。

  1. gradle install:

该指令用于将项目安装到本地Maven仓库。Gradle会执行项目的安装任务,并将结果保存到本地Maven仓库中。这个指令对于在本地测试项目非常有用。

  1. gradle run:

该指令用于运行项目。Gradle会执行项目的运行任务,并启动应用程序。这个指令对于在本地测试项目非常有用。

  1. gradle wrapper:

该指令用于生成Gradle Wrapper,用于在没有Gradle安装的系统上运行构建。Gradle Wrapper是一个脚本,它可以自动下载和安装所需版本的Gradle,并运行项目的构建。这个指令对于在没有Gradle安装的系统上构建项目非常有用。

三、Wrapper 包装器

3.1 什么是Wrapper 包装器

Wrapper(包装器)是GradleMaven中常用的工具,它可以帮助开发者将构建工具和项目结合起来,从而更方便地进行构建和管理项目。

  1. 在Gradle中:

Wrapper是一个Gradle工具,它可以生成一个包含Gradle版本信息和Gradle Wrapper脚本的文件夹。开发者可以将该文件夹放置在项目中,并使用该文件夹中的gradlewgradlew.bat脚本来执行Gradle构建任务。这样做的好处是,项目中的所有开发者都可以使用相同版本的Gradle,从而避免了因Gradle版本不一致导致的构建问题。

  1. 在Maven中

Wrapper是一个叫做Maven Wrapper的插件,可以将Maven版本信息和Maven Wrapper脚本打包到项目中。开发者可以使用该项目中的mvnwmvnw.bat脚本来执行Maven构建任务。同样,这种做法也可以确保所有开发者都使用相同版本的Maven进行构建。

使用Wrapper的好处是,在一个项目中,所有的开发者使用的构建工具版本都一致,从而可以保证构建结果的一致性。此外,Wrapper还可以自动下载构建工具,而无需手动安装和配置构建工具,从而降低了配置和使用的难度。

3.2 Wrapper 包装器怎么使用

在Gradle中使用Wrapper:

Gradle中,Wrapper是一个Gradle工具,可以使用以下步骤来生成Wrapper

  1. 在项目根目录下执行以下命令,生成Wrapper
./gradlew wrapper --gradle-version <version>

其中,<version>是指定的Gradle版本号,例如4.10.2。

  1. 执行完以上命令后,会在项目根目录下生成一个名为gradle/wrapper的文件夹,其中包含了以下文件:
  • gradle-wrapper.jar:Gradle包装器的核心文件。
  • gradle-wrapper.properties:Gradle包装器的配置文件。
  • gradlew:Unix/Linux系统下的Gradle包装器脚本。
  • gradlew.bat:Windows系统下的Gradle包装器脚本。
  1. 使用生成的gradlewgradlew.bat脚本来执行Gradle构建任务。例如,执行以下命令来构建项目:
./gradlew build

在Maven中使用Wrapper:

Maven中,Wrapper是一个叫做Maven Wrapper的插件,可以使用以下步骤来生成Wrapper

  1. 在项目根目录下执行以下命令,生成Wrapper
./mvnw -N io.takari:maven:wrapper -Dmaven=3.8.1

其中,3.8.1是指定的Maven版本号。

  1. 执行完以上命令后,会在项目根目录下生成一个名为.mvn/wrapper的文件夹,其中包含了以下文件:
  • maven-wrapper.jar:Maven包装器的核心文件。
  • maven-wrapper.properties:Maven包装器的配置文件。
  • mvnw:Unix/Linux系统下的Maven包装器脚本。
  • mvnw.cmd:Windows系统下的Maven包装器脚本。
  1. 使用生成的mvnwmvnw.cmd脚本来执行Maven构建任务。例如,执行以下命令来构建项目:
./mvnw clean package

使用Wrapper的好处是,在一个项目中,所有的开发者使用的构建工具版本都一致,从而可以保证构建结果的一致性。此外,Wrapper还可以自动下载构建工具,而无需手动安装和配置构建工具,从而降低了配置和使用的难度。

Gradle学习系列之一——Gradle快速入门

Gradle学习系列之一——Gradle快速入门

这是一个关于Gradle的学习系列,其中包含以下文章:

    1. Gradle快速入门
    2. 创建Task的多种方法
    3. 读懂Gradle语法
    4. 增量式构建
    5. 自定义Property
    6. 使用java Plugin
    7. 依赖管理
    8. 构建多个Project
    9. 自定义Task类型
    10. 自定义Plugin

 

  

  请通过以下方式下载本系列文章的Github示例代码:

git clone https://github.com/davenkin/gradle-learning.git

 


 

  和Maven一样,Gradle只是提供了构建项目的一个框架,真正起作用的是Plugin。Gradle在默认情况下为我们提供了许多常用的Plugin,其中包括有构建Java项目的Plugin,还有War,Ear等。与Maven不同的是,Gradle不提供内建的项目生命周期管理,只是java Plugin向Project中添加了许多Task,这些Task依次执行,为我们营造了一种如同Maven般项目构建周期。更多有关Maven的知识,读者可以访问Maven官网,或者可以参考笔者写的Maven学习系列文章

 

  现在我们都在谈领域驱动设计,Gradle本身的领域对象主要有Project和Task。Project为Task提供了执行上下文,所有的Plugin要么向Project中添加用于配置的Property,要么向Project中添加不同的Task。一个Task表示一个逻辑上较为独立的执行过程,比如编译Java源代码,拷贝文件,打包Jar文件,甚至可以是执行一个系统命令或者调用Ant。另外,一个Task可以读取和设置Project的Property以完成特定的操作。

  让我们来看一个最简单的Task,创建一个build.gradle文件,内容如下:

task helloWorld << {
   println "Hello World!"
}

 

  这里的“<<”表示向helloWorld中加入执行代码——其实就是groovy代码。Gradle向我们提供了一整套DSL,所以在很多时候我们写的代码似乎已经脱离了groovy,但是在底层依然是执行的groovy。比如上面的task关键字,其实就是一个groovy中的方法,而大括号之间的内容则表示传递给task()方法的一个闭包。除了“<<”之外,我们还很多种方式可以定义一个Task,我们将在本系列后续的文章中讲到。

  在与build.gradle相同的目录下执行:

gradle helloWorld

 

  命令行输出如下:

复制代码
:helloWorld
Hello World!

BUILD SUCCESSFUL

Total time: 2.544 secs
复制代码

 

  在默认情况下,Gradle将当前目录下的build.gradle文件作为项目的构建文件。在上面的例子中,我们创建了一个名为helloWorld的Task,在执行gradle命令时,我们指定执行这个helloWorld Task。这里的helloWorld是一个DefaultTask类型的对象,这也是定义一个Task时的默认类型,当然我们也可以显式地声明Task的类型,甚至可以自定义一个Task类型(我们将在本系列的后续文章中讲到)。

  比如,我们可以定义一个用于文件拷贝的Task:

task copyFile(type: Copy) {
   from \'xml\'
   into \'destination\'
}

 

  以上copyFile将xml文件夹中的所有内容拷贝到destination文件夹中。这里的两个文件夹都是相对于当前Project而言的,即build.gradle文件所在的目录。

  Task之间可以存在依赖关系,比如taskA依赖于taskB,那么在执行taskA时,Gradle会先执行taskB,然后再执行taskA。声明Task依赖关系的一种方式是在定义一个Task的时候:

task taskA(dependsOn: taskB) {
   //do something
}

 


  Gradle在默认情况下为我们提供了几个常用的Task,比如查看Project的Properties、显示当前Project中定义的所有Task等。可以通过一下命令查看Project中所有的Task:

gradle tasks

 

  输出如下:

复制代码
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
setupBuild - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Help tasks
----------
dependencies - Displays all dependencies declared in root project \'gradle-blog\'.
dependencyInsight - Displays the insight into a specific dependency in root project \'gradle-blog\'.
help - Displays a help message
projects - Displays the sub-projects of root project \'gradle-blog\'.
properties - Displays the properties of root project \'gradle-blog\'.
tasks - Displays the tasks runnable from root project \'gradle-blog\'.

Other tasks
-----------
copyFile
helloWorld

To see all tasks and more detail, run with --all.

BUILD SUCCESSFUL

Total time: 2.845 secs
复制代码

 

  可以看到,除了我们自己定义的copyFile和helloWorld之外,Gradle还默认为我们提供了dependencies、projects和properties等Task。dependencies用于显示Project的依赖信息,projects用于显示所有Project,包括根Project和子Project,而properties则用于显示一个Project所包含的所有Property。

  在默认情况下,Gradle已经为Project添加了很多Property,我们可以调用以下命令进行查看:

gradle properties

 

  输出如下:

复制代码
:properties

------------------------------------------------------------
Root project
------------------------------------------------------------

allprojects: [root project \'gradle-blog\']
ant: org.gradle.api.internal.project.DefaultAntBuilder@1342097

buildDir: /home/davenkin/Desktop/gradle-blog/build
buildFile: /home/davenkin/Desktop/gradle-blog/build.gradle
...
configurations: []
convention: org.gradle.api.internal.plugins.DefaultConvention@11492ed
copyFile: task \':copyFile\'
...
ext: org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension@1b5d53a
extensions: org.gradle.api.internal.plugins.DefaultConvention@11492ed
...
helloWorld: task \':helloWorld\'
...
plugins: [org.gradle.api.plugins.HelpTasksPlugin@7359f7]
project: root project \'gradle-blog\'
...
properties: {...}
repositories: []

tasks: [task \':copyFile\', task \':helloWorld\']
version: unspecified

BUILD SUCCESSFUL

Total time: 2.667 secs
复制代码

 

  在以上Property中,allprojects表示所有的Project,这里只包含一个根Project,在多项目构建中,它将包含多个Project;buildDir表示构建结果的输出目录;我们自己定义的helloWorld和copyFile也成为了Project中的Property。另外,Project还包括用于执行Ant命令的DefaultAntBuilder(Property名为ant)和Project的描述属性description。

 

  在下一篇文章中,我们将讲到创建Task的多种方法。

以上是关于20分钟快速入门Gradle的主要内容,如果未能解决你的问题,请参考以下文章

简单理解Gradle,Gradle是什么,一分钟入门Gradle

Gradle学习系列之一——Gradle快速入门

Gradle的快速入门

Gradle快速入门

Dva快速入门,5分钟入门10分钟精通

什么是 gradle java 插件的“实现”配置? [复制]