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的异同
Gradle
和Maven
都是用于构建和管理Java
项目的工具。
它们之间的异同如下:
- 相同点:
Gradle
和Maven
都可以用于构建和管理Java
项目,以及管理项目依赖关系。- 它们都使用了基于插件的架构,允许用户通过配置插件来实现不同的功能。
Gradle
和Maven
都可以自动下载和管理项目依赖项,并将它们添加到构建路径中。- 它们都支持跨平台运行,可以在
Windows
、Linux
和macOS
等操作系统上运行。
不同点:
Gradle
使用基于Groovy
和Kotlin
的DSL
语言来定义构建脚本,而Maven
使用基于XML
的POM
文件来定义项目和构建配置。Gradle
的构建脚本更加灵活和可读性更好,支持自定义任务和插件,也可以使用Java
代码来编写构建逻辑。而Maven
的POM
文件虽然规范化,但不如Gradle
灵活。Gradle
的构建速度通常比Maven
更快,因为它使用增量构建和缓存构建结果等优化策略,能够更快地处理复杂的构建逻辑。Gradle
可以处理更多类型的项目,包括Java
、Groovy
、Kotlin
、Scala
、Android
等,而Maven
主要用于Java
项目。Gradle
的学习曲线可能比Maven
陡峭一些,但一旦掌握了其基本概念和语法,就可以更灵活地处理复杂的构建任务。
总结:选择Gradle还是Maven,取决于项目的具体需求和个人偏好。
二、Gradle常用命令
gradle build
:
该指令用于编译项目并生成可执行文件。Gradle
会执行项目的所有构建任务,并在完成后生成可执行文件。如果构建成功,生成的文件会被保存在项目的build
目录下。
gradle clean
:
该指令用于删除构建目录。Gradle
会删除项目的 build
目录和其他临时文件。这样可以确保每次构建都是从头开始,而不会受到以前构建的影响。
gradle test
:
该指令用于运行项目的测试。Gradle
会执行项目的测试任务,并输出测试结果。如果所有测试都通过,则Gradle
将返回成功代码。
gradle tasks
:
该指令用于列出可用的构建任务。Gradle
会输出项目中定义的所有任务,以及它们之间的依赖关系。这个指令对于查看项目中可用的任务非常有用。
gradle dependencies
:
该指令用于列出项目的依赖项。Gradle
会输出项目的所有依赖项,包括其名称、版本和其它详细信息。
gradle assemble
:
该指令用于将项目打包成一个归档文件。Gradle
会执行项目的打包任务,并将结果保存到项目的 build
目录下。这个指令对于将项目打包成一个可部署文件非常有用。
gradle install
:
该指令用于将项目安装到本地Maven
仓库。Gradle
会执行项目的安装任务,并将结果保存到本地Maven
仓库中。这个指令对于在本地测试项目非常有用。
gradle run
:
该指令用于运行项目。Gradle
会执行项目的运行任务,并启动应用程序。这个指令对于在本地测试项目非常有用。
gradle wrapper
:
该指令用于生成Gradle Wrapper
,用于在没有Gradle
安装的系统上运行构建。Gradle Wrapper
是一个脚本,它可以自动下载和安装所需版本的Gradle
,并运行项目的构建。这个指令对于在没有Gradle
安装的系统上构建项目非常有用。
三、Wrapper 包装器
3.1 什么是Wrapper 包装器
Wrapper
(包装器)是Gradle
和Maven
中常用的工具,它可以帮助开发者将构建工具和项目结合起来,从而更方便地进行构建和管理项目。
- 在Gradle中:
Wrapper
是一个Gradle
工具,它可以生成一个包含Gradle
版本信息和Gradle Wrapper
脚本的文件夹。开发者可以将该文件夹放置在项目中,并使用该文件夹中的gradlew
或gradlew.bat
脚本来执行Gradle
构建任务。这样做的好处是,项目中的所有开发者都可以使用相同版本的Gradle
,从而避免了因Gradle
版本不一致导致的构建问题。
- 在Maven中
Wrapper
是一个叫做Maven Wrapper
的插件,可以将Maven
版本信息和Maven Wrapper
脚本打包到项目中。开发者可以使用该项目中的mvnw
或mvnw.bat
脚本来执行Maven
构建任务。同样,这种做法也可以确保所有开发者都使用相同版本的Maven
进行构建。
使用Wrapper
的好处是,在一个项目中,所有的开发者使用的构建工具版本都一致,从而可以保证构建结果的一致性。此外,Wrapper
还可以自动下载构建工具,而无需手动安装和配置构建工具,从而降低了配置和使用的难度。
3.2 Wrapper 包装器怎么使用
在Gradle中使用Wrapper:
在Gradle
中,Wrapper
是一个Gradle
工具,可以使用以下步骤来生成Wrapper
:
- 在项目根目录下执行以下命令,生成
Wrapper
:
./gradlew wrapper --gradle-version <version>
其中,<version>
是指定的Gradle版本号,例如4.10.2。
- 执行完以上命令后,会在项目根目录下生成一个名为
gradle/wrapper
的文件夹,其中包含了以下文件:
- gradle-wrapper.jar:Gradle包装器的核心文件。
- gradle-wrapper.properties:Gradle包装器的配置文件。
- gradlew:Unix/Linux系统下的Gradle包装器脚本。
- gradlew.bat:Windows系统下的Gradle包装器脚本。
- 使用生成的
gradlew
或gradlew.bat
脚本来执行Gradle
构建任务。例如,执行以下命令来构建项目:
./gradlew build
在Maven中使用Wrapper:
在Maven
中,Wrapper
是一个叫做Maven Wrapper
的插件,可以使用以下步骤来生成Wrapper
:
- 在项目根目录下执行以下命令,生成
Wrapper
:
./mvnw -N io.takari:maven:wrapper -Dmaven=3.8.1
其中,3.8.1
是指定的Maven版本号。
- 执行完以上命令后,会在项目根目录下生成一个名为
.mvn/wrapper
的文件夹,其中包含了以下文件:
- maven-wrapper.jar:Maven包装器的核心文件。
- maven-wrapper.properties:Maven包装器的配置文件。
- mvnw:Unix/Linux系统下的Maven包装器脚本。
- mvnw.cmd:Windows系统下的Maven包装器脚本。
- 使用生成的
mvnw
或mvnw.cmd
脚本来执行Maven
构建任务。例如,执行以下命令来构建项目:
./mvnw clean package
使用Wrapper
的好处是,在一个项目中,所有的开发者使用的构建工具版本都一致,从而可以保证构建结果的一致性。此外,Wrapper
还可以自动下载构建工具,而无需手动安装和配置构建工具,从而降低了配置和使用的难度。
Gradle学习系列之一——Gradle快速入门
Gradle学习系列之一——Gradle快速入门
这是一个关于Gradle的学习系列,其中包含以下文章:
请通过以下方式下载本系列文章的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的主要内容,如果未能解决你的问题,请参考以下文章