Gradle极简入门

什么是 Gradle

Gradle是一个基于Apache AntApache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,而不是传统的XMLGradle构建脚本是用Groovy编写的,也可以使用Kotlin编写,两者都是基于JVM的语言。

安装 Gradle

在开始之前,想必大家已经学会了Java或者Kotlin,现在大家都在使用Android Studio开发Android应用,Android Studio是基于IntelliJ IDEA开发的,但现在不从Android Studio的角度来讲,也不从IntelliJ IDEA的角度来讲,而是从Gradle的角度来讲,所以我们需要去官网下载Gradle,然后在IntelliJ IDEA中去使用Gradle

首先去官网下载Gradle,下载地址:https://gradle.org/releases/,之后点击最新版本中的binary-only,这会直接下载一个zip压缩包,下载完成后解压到一个目录,然后再配置环境变量到bin目录,这样就可以在Terminal中使用gradle命令了,因为Java跨平台的缘故,在其他的操作系统上配置环境变量的方式都是大相不差的,这里我就不再赘述了,如果不会配置环境变量的话,可以去网上搜索一下,这里我就不再赘述了。

配置好环境变量之后,打开Terminal,输入gradle -v,如果出现下面的信息,说明Gradle安装成功了。

------------------------------------------------------------
Gradle 8.1
------------------------------------------------------------

Build time:   2023-04-12 12:07:45 UTC
Revision:     40ba32cde9d6daf2b92c39376d2758909dd6b813

Kotlin:       1.8.10
Groovy:       3.0.15
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          17.0.6 (BellSoft 17.0.6+10-LTS)
OS:           Windows 10 10.0 amd64

创建 Hello World 项目

创建一个文件夹,然后在文件夹中打开Terminal,输入gradle init,之后按照我的步骤来。

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2 // 选择 application

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 3 // 选择 Java

Generate multiple subprojects for application? (default: no) [yes, no] // 默认 no

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 2 // 选择 Kotlin

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4] //默认 JUnit Jupiter

Project name (default: gradle_learn):
Source package (default: gradle_learn): cn.enaium
Enter target version of Java (min. 7) (default: 17): // 默认 17
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] // 默认 no


> Task :init
Get more help with your project: https://docs.gradle.org/8.1/samples/sample_building_java_applications.html

BUILD SUCCESSFUL in 32s // 构建成功
2 actionable tasks: 2 executed

如果最后出现BUILD SUCCESSFUL,说明项目创建成功了,现在我们来看一下项目的结构,这里先简单的介绍一下,后面会详细的介绍。

│  .gitattributes // git 配置文件
│  .gitignore // git 配置文件
│  gradlew // gradle 脚本,当你没有安装 gradle 的时候,可以使用这个脚本来构建项目
│  gradlew.bat // windows 下的 gradlew 脚本
│  settings.gradle.kts // gradle 的settings配置文件
│  
├─.gradle
├─app // 项目模块,这是一个子项目
│  │  build.gradle.kts // app 模块的 build 配置文件
│  │  
│  └─src // app 模块的源码
│      ├─main
│      │  ├─java
│      │  │  └─cn
│      │  │      └─enaium
│      │  │              App.java
│      │  │              
│      │  └─resources
│      └─test
│          ├─java
│          │  └─cn
│          │      └─enaium
│          │              AppTest.java
│          │              
│          └─resources
└─gradle // gradle 的wrapper配置文件,当你没有安装 gradle 的时候,脚本会自使用wrapper来下载 gradle
    └─wrapper
            gradle-wrapper.jar
            gradle-wrapper.properties // gradle 的wrapper配置文件,下载的 gradle 版本,下载地址等

运行项目,打开Terminal,输入gradle run,如果出现下面的信息,说明项目运行成功了,这里项目中自带了一个Guava库和JUnit库,如果嫌下载太慢的话,可以自己去build.gradle.kts中删除掉。

> Task :app:run                                                                                                         
Hello World!

BUILD SUCCESSFUL in 10s
2 actionable tasks: 2 executed

删掉

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation("org.junit.jupiter:junit-jupiter:5.9.1")

    // This dependency is used by the application.
    implementation("com.google.guava:guava:31.1-jre")
}

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

项目结构

settings.gradle.kts

settings.gradle.ktsGradle的配置文件,这个文件中配置了项目的名称和模块,这里的模块指的是app模块,这个模块是Gradle默认创建的,如果你想创建其他的模块,可以在这里配置。

//这个是gradle创建时自带的一个插件,这个插件可以自动下载jdk
plugins {
    // Apply the foojay-resolver plugin to allow automatic download of JDKs
    id("org.gradle.toolchains.foojay-resolver-convention") version "0.4.0"//插件的ID和版本,这里的插件会从Gradle的插件仓库中下载,结构和Maven仓库类似
}

rootProject.name = "gradle_learn"//项目名称
include("app")//包含的模块

build.gradle.kts

在大部分情况下,都没有使用App最为子模块(除了Android项目),也就是直接从其中的src开始,项目结构如下。

│  build.gradle.kts // build 配置文件
│  settings.gradle.kts// settings 配置文件
│  
├─gradle
│  └─wrapper
│          gradle-wrapper.jar
│          gradle-wrapper.properties
│          
└─src // 源码
    ├─main
    └─test

但基本上都差不多,因为每个项目中都会有build.gradle.kts,这就是当前项目的build配置文件,这个文件中配置了项目的build信息,比如项目的groupversiondependencies等。

plugins {// 当前项目使用的插件,这里如果有子项目,子项目也会使用这里的插件
    // Apply the application plugin to add support for building a CLI application in Java.
    application // 应用插件,这个插件会自动创建一个`run`任务,用于运行项目
}

repositories {// 项目的仓库,这里的仓库是用于下载依赖的,这里的仓库是`Maven`仓库,也就是`Maven Central`
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {// 项目的依赖,这里的依赖是`Maven`仓库中的依赖,这里的依赖是`JUnit`和`Guava`
    // Use JUnit Jupiter for testing.
    testImplementation("org.junit.jupiter:junit-jupiter:5.9.1")// 测试依赖,testImplementation是测试依赖,implementation是应用依赖

    // This dependency is used by the application.
    implementation("com.google.guava:guava:31.1-jre")// 应用依赖,其中的字符串是`Maven`仓库中的依赖,使用分号分割,第一个是`group`,第二个是`name`,第三个是`version`
}

// Apply a specific Java toolchain to ease working on different environments.
java {// java的配置,这里配置了java的版本
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(17))// java的版本
    }
}

tasks.named<Test>("test") {// test任务的配置,这里配置了test任务的使用的测试框架
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()// 使用JUnit作为测试框架
}

//Application插件的配置,这里配置了mainClass,也就是项目的入口类
application {
    // Define the main class for the application.
    mainClass.set("cn.enaium.App")// 入口类
}

gradle-wrapper.properties

# distributionBase 就是下载的gradle的存放位置,如果环境中没有配置GRADLE_USER_HOME,那么就会使用默认的位置,也就是当前用户的目录下
distributionBase=GRADLE_USER_HOME
# distributionPath 就是下载的gradle的存放位置,也就是distributionBase的目录中的wrapper/dists目录
distributionPath=wrapper/dists
# distributionUrl 就是下载的gradle的地址,这里的地址是gradle的官方地址,也就是https://services.gradle.org/distributions/gradle-8.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip
# networkTimeout 就是下载gradle的超时时间,单位是毫秒
networkTimeout=10000
# 和上面同理
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

src

├─main
│  ├─java
│  │  └─cn
│  │      └─enaium
│  └─resources
└─test
    ├─java
    │  └─cn
    │      └─enaium
    └─resources

这个目录下的内容就是项目的源码了,这里的maintest两个都是源码目录,只不过main是项目的源码,test是项目的测试源码,这两个目录下都有javaresources两个目录,java目录下存放的是java源码,resources目录下存放的是资源文件,比如properties文件,xml文件等,这里都是固定的格式,如果你想要自定义,可以在build.gradle.kts中配置,但本篇文章是简单的入门,所以就不介绍了。

命令/任务

gradle tasks

这个命令是查看当前项目的所有任务,这个命令会列出所有的任务,包括Gradle自带的任务,比如buildclean等,还有App模块自带的任务,比如runtest等,这里只介绍一下比较常用的命令,其他的命令可以自行查看。

> Task :tasks //任务的名称,这里是tasks,也就是说查看所有任务也是一个任务                                                                                                           

------------------------------------------------------------
Tasks runnable from root project 'gradle_learn'
------------------------------------------------------------

Application tasks// 任务的Group,这里是Application,这个是Application插件自带的任务
-----------------
run - Runs this project as a JVM application // 任务的名称

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Distribution tasks
------------------
assembleDist - Assembles the main distributions
distTar - Bundles the project as a distribution.
distZip - Bundles the project as a distribution.
installDist - Installs the project as a distribution as-is.

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradle_learn'.
dependencies - Displays all dependencies declared in root project 'gradle_learn'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle_learn'.
help - Displays a help message.
javaToolchains - Displays the detected java toolchains.
kotlinDslAccessorsReport - Prints the Kotlin code for accessing the currently available project extensions and conventions.
outgoingVariants - Displays the outgoing variants of root project 'gradle_learn'.
projects - Displays the sub-projects of root project 'gradle_learn'.
properties - Displays the properties of root project 'gradle_learn'.
resolvableConfigurations - Displays the configurations that can be resolved in root project 'gradle_learn'.
tasks - Displays the tasks runnable from root project 'gradle_learn' (some of the displayed tasks may belong to subprojects).

Verification tasks
------------------
check - Runs all checks.
test - Runs the test suite.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

gradle run

这个命令是Application插件专有的命令,这个命令会运行Application插件配置的入口类,这里的入口类是cn.enaium.App,也就是build.gradle.kts中配置的mainClass

gradle init

也就是本篇文章最开始所用到的任务,这个任务会生成一个gradle项目。

gradle build

构建项目,这个命令会执行build.gradle.kts中配置的build任务,这个命令会生成一个build目录,这个目录下存放的是构建后的文件,比如jar文件,class文件等。

IntelliJ IDEA

导入项目

打开IntelliJ IDEA,点击Open,选择项目所在的目录,点击OK,这样就可以导入项目了。

配置Gradle

基本上大多数的项目都不需要特意配置Gradle,打开设置中File> Settings> Build, Execution, Deployment> Build Tools> Gradle,这里就是关于Gradle的配置,其中Gradle JVMGradleJVM配置,也就是运行GradleJDK版本,之后打开IntelliJ IDEA右侧的Gradle,可以看到所有的项目模块还有所有任务,并且项目中所用到的依赖都会在这里显示出来,如果你想要运行某个任务,可以在这里双击,也可以在Terminal中输入gradle <task>,比如gradle run,这样就可以运行run任务了。

总结

本篇文章主要介绍了Gradle的基本使用,包括Gradle的安装,Gradle的目录结构,Gradle的命令/任务,IntelliJ IDEA的配置,Gradle的配置,Gradle的使用,Gradle的插件,Gradle的依赖,GradleJVM配置,但是本篇文章只是简单的介绍了一下,如果想要深入了解,可以查看Gradle官方文档