【笔记】Gradle学习笔记

前言

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。Gradle 构建脚本使用的是 Groovy 或 Kotlin 的特定领域语言来编写的,而不是传统的XML。
当前官方支持的语言为Java、Groovy、Scala、C++、Swift、JavaScript等以及Spring框架。(维基百科

初始化项目

  • 如果当前目录不为空,会提示是否覆盖
1
gradle init

查看支持的任务

1
gradle tasks

清理构建的文件

1
gradle clean

以JVM应用程序的形式运行

  • 来自application插件
1
gradle run

编译代码

  • 来自java插件

-q:不显示输出

1
gradle classes

测试代码

  • 来自java插件
1
gradle test

完整构建

  • 包含编译和测试
  • 来自application插件和java插件
1
gradle build

使用Groovy作为构建脚本语言

Java项目构建脚本

settings.gradle
1
rootProject.name = ''
build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
plugins {
id 'java'
}

group = 'org.example'
version = '1.0-SNAPSHOT'

repositories {
mavenCentral()
}

dependencies {
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
}

test {
useJUnitPlatform()
}

JavaWeb项目构建脚本

  • src/main目录下创建webapp/WEB-INF/web.xml文件
src/main/webapp/WEB-INF/web.xml
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
  • build.gradle文件中添加war插件
build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
plugins {
id 'java'
id 'war'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
mavenCentral()
}

dependencies {
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
}

test {
useJUnitPlatform()
}

包含父子级模块的微服务项目构建脚本

子模块继承父模块的依赖

  • 如果希望子模块继承父模块的依赖,可以在父模块的build.gradle文件通过allprojects{}定义公共依赖,此时所有子模块build.gradle即使什么也不配置,也同样拥有所有被allprojects{}包裹起来的配置
build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
allprojects {
plugins {
id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
mavenCentral()
}

dependencies {
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
}

test {
useJUnitPlatform()
}
}

子模块引用其他子模块的依赖

  • 如果多个子模块需要引用相同的依赖,可以通过在其中一个子模块的build.gradle文件配置依赖,然后在另一个子模块引用这个子模块的所有依赖

:子模块名:其他子模块名可以在父模块的settings.gradle中复制

build.gradle
1
2
3
dependencies {
compile(":子模块名")
}

使用Kotlin作为构建脚本语言

Java项目构建脚本

settings.gradle.kts
1
rootProject.name = ""
build.gradle.kts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
plugins {
id("java")
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
mavenCentral()
}

dependencies {
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
}

tasks.test {
useJUnitPlatform()
}

将Maven的本地仓库作为Gradle的本地仓库

~/.bashrc
1
export GRADLE_USER_HOME="Maven的本地仓库路径"

settings.gradle

  • settings.gradle文件的全局对象为settings,可以省略

settings对象的属性

定义根项目名

settings.gradle.kts
1
rootProject.name = "项目名"

settings对象的方法

配置插件

id(""):根据插件ID指定插件
version(""):指定插件版本

settings.gradle.kts
1
2
3
plugins {
id("") version ""
}

配置子模块

settings.gradle.kts
1
include("子模块名")
settings.gradle.kts
1
include("子模块名1", "子模块名2")

配置插件仓库和依赖仓库

gradlePluginPortal():Gradle插件仓库
google():Google插件仓库
maven:配置Maven插件仓库

setUrl(""):配置Maven仓库URL

https://maven.aliyun.com/repository/public:阿里云Maven仓库

settings.gradle.kts
1
2
3
4
5
6
7
8
9
pluginManagement {
repositories {
gradlePluginPortal()
google()
maven {
setUrl("https://maven.aliyun.com/repository/public")
}
}
}

build.gradle

  • build.gradle文件的全局对象为project,可以省略

project对象的属性

定义组ID

build.gradle.kts
1
group = "org.example"

定义项目版本号

build.gradle.kts
1
version = "1.0-SNAPSHOT"

定义项目名

build.gradle.kts
1
name = "demo"

定义项目描述

build.gradle.kts
1
description = "项目描述"

project对象的方法

配置插件

id("java"):构建Java项目
id("war"):构建JavaWeb项目
id("application"):构建Java项目,生成可执行程序(Jar包)
id("cpp-application"):构建C++应用
id("swift-application"):构建Swift应用
id("org.jetbrains.kotlin.jvm") version "2.1.21"kotlin("jvm") version "2.1.21":构建Kotlin项目

build.gradle.kts
1
2
3
plugins {
id("java")
}

配置依赖仓库

mavenCentral():Maven官方仓库
maven:配置Maven仓库

setUrl(""):配置Maven仓库URL

https://maven.aliyun.com/repository/public:阿里云Maven仓库

build.gradle.kts
1
2
3
4
5
6
respositories {
mavenCentral()
maven {
setUrl("https://maven.aliyun.com/repository/public")
}
}

配置项目依赖

  • 传递一个参数

5.10.0:指定具体版本
+:指定最新版本

build.gradle.kts
1
2
3
dependencies {
implementation(platform("org.junit:junit-bom:5.10.0"))
}
  • 传递三个参数
build.gradle.kts
1
2
3
dependencies {
implementation(platform("org.junit", "junit-bom", "5.10.0"))
}
配置不同场景的依赖
配置依赖
build.gradle.kts
1
2
3
dependencies {
implementation("")
}
配置API依赖
  • API依赖会暴露给所有项目的模块
build.gradle.kts
1
2
3
dependencies {
api("")
}
配置仅编译时依赖
build.gradle.kts
1
2
3
dependencies {
compileOnly("")
}
配置仅运行时依赖
build.gradle.kts
1
2
3
dependencies {
runtimeOnly("")
}
配置仅测试时依赖
build.gradle.kts
1
2
3
dependencies {
testImplementation("")
}
配置仅安卓测试时依赖
build.gradle.kts
1
2
3
dependencies {
androidTestImplementation("")
}
配置Java注解处理依赖
build.gradle.kts
1
2
3
dependencies {
annotationProcessor("")
}
配置Kotlin注解处理依赖
build.gradle.kts
1
2
3
dependencies {
kapt("")
}
指定本地文件作为依赖
指定文件
build.gradle.kts
1
2
3
dependencies {
implementation(files("lib/<file_1>.jar"), files("lib/<file_2>.jar"))
}
指定目录
build.gradle.kts
1
2
3
dependencies {
implementation(fileTree("lib"))
}
指定子模块作为依赖
build.gradle.kts
1
2
3
dependencies {
implementation(project(":模块名"))
}
配置排除子依赖
排除单个依赖
build.gradle.kts
1
2
3
4
5
dependencies {
implementation("") {
exclude("org.junit")
}
}
排除整组依赖
build.gradle.kts
1
2
3
4
5
dependencies {
implementation("") {
exclude("org.junit", "junit-bom")
}
}
强制依赖版本

!!:强制指定的依赖版本

build.gradle.kts
1
2
3
dependencies {
implementation(platform("org.junit:junit-bom:5.10.0!!"))
}

配置测试

build.gradle.kts
1
2
3
tasks.test {
useJUnitPlatform()
}

配置Java版本(Java插件)

souceCompatibility:定义编码时的Java版本
targetCompatibility:定义编译后需要的Java版本

build.gradle.kts
1
2
3
4
java {
souceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
build.gradle.kts
1
2
3
4
configure<JavaPluginExtension> {
souceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}

配置主类(Application插件)

build.gradle.kts
1
2
3
application {
mainClass = "org.example.demo.Main"
}
build.gradle.kts
1
2
3
configure<JavaApplication> {
mainClass = "org.example.demo.Main"
}

任务配置

添加或修改任务配置

添加自定义任务配置

build.gradle.kts
1
2
3
tasks.register("新任务名") {
...
}

根据任务类添加自定义任务配置

build.gradle.kts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
abstract class 任务类名 : DefaultTask() {

private var 属性名: String = ""

@TaskAction
fun doTask() {
...
}

fun method(形参) {
...
}
}

tasks.register<任务类名>(属性值) {
method(实参)
}

修改已存在任务配置

build.gradle.kts
1
2
3
tasks.named("已存在任务名") {
...
}

修改build任务配置

build.gradle.kts
1
2
3
tasks.build {
...
}

修改默认任务配置

build.gradle.kts
1
2
3
tasks.register<Task> {
...
}

指定默认任务

build.gradle.kts
1
defaultTasks("任务名")
1
./gradlew

为任务添加生命周期函数

build.gradle.kts
1
2
3
4
5
6
7
8
tasks.register("任务名") {
doFirst {
...
}
doLast {
...
}
}
1
./gradlew 任务名

为任务添加命令行参数

build.gradle.kts
1
2
3
4
5
6
7
8
tasks.register("任务名") {
doFirst {
println(project.properties["参数名"])
}
doLast {
...
}
}
1
./gradlew 任务名 -P 参数名=值

定义任务所在组

  • 在IDEA的Gradle插件中会以组区分任务,默认组名为build
build.gradle.kts
1
2
3
4
5
tasks.register("任务名") {

group = "build"

}

定义任务描述

build.gradle.kts
1
2
3
4
5
6
7
8
9
10
11
tasks.register("任务名") {

description = "任务描述"

doFirst {
...
}
doLast {
...
}
}
1
./gradlew tasks

依赖于其他任务

  • 在其他任务执行之后执行当前任务
build.gradle.kts
1
2
3
4
5
tasks.register("任务名") {

dependsOn("任务名")

}
build.gradle.kts
1
2
3
4
5
tasks.register("任务名") {

dependsOn(tasks.compileJava)

}

项目发布

引入maven-publish插件

build.gradle.kts
1
2
3
plugins {
id("maven-publish")
}

添加发布配置

build.gradle.kts
1
2
3
4
5
6
7
8
9
10
11
12
13
publishing {
publications {
create<MavenPublication>("library") {
groupId = "org.example"
artifact = "demo"
version = "1.0-SNAPSHOT"
from(components["java"])
}
}
repositories {
mavenLocal()
}
}

多模块项目配置

当前模块及所有子模块都生效的配置

build.gradle.kts
1
2
3
allprojects {
...
}

所有子模块都生效的配置

build.gradle.kts
1
2
3
subprojects {
...
}

配置插件

build.gradle.kts
1
2
3
subprojects {
apply(plugin = "java")
}

以Kotlin文件作为Gradle配置

引入kotlin-dsl插件

build.gradle.kts
1
2
3
plugins {
id("kotlin-dsl")
}

自定义函数

定义函数

src/main/kotlin/Maven.kt
1
2
3
4
5
import org.gradle.api.artifacts.dsl.RepositoryHandler

fun RepositoryHandler.mavenAlibaba() = maven {
setUrl("https://maven.aliyun.com/repository/public")
}

调用函数

build.gradle.kts
1
2
3
repositories {
mavenAlibaba()
}

自定义属性

定义属性

src/main/kotlin/Maven.kt
1
2
3
4
5
6
import org.gradle.api.JavaVersion

object Version {
val sourceVersion = JavaVersion.VERSION_21
val targetVersion = JavaVersion.VERSION_21
}

调用属性

build.gradle.kts
1
2
3
4
configure<JavaPluginExtension> {
sourceCompatibility = Version.sourceVersion
targetCompatibility = Version.targetVersion
}

自定义插件及任务

定义插件类

src/main/kotlin/Plugin.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import org.gradle.api.Plugin
import org.gradle.api.Project

class 插件类名 : Plugin<Project> {
override fun apply(target: Project) {
target.tasks.register("任务名1") {
doFirst {
...
}
doLast {
...
}
}
target.tasks.register("任务名2") {
doFirst {
...
}
doLast {
...
}
}
}
}

通过插件类配置插件id

build.gradle.kts
1
2
3
4
5
6
7
8
gradlePlugin {
plugins {
create("插件名") {
id = "自定义插件id"
implementationClass = "插件类全局限定名"
}
}
}

调用插件

build.gradle.kts
1
2
3
plugins {
id("自定义插件id")
}

完成

参考文献

哔哩哔哩——代码基基
javaroad
哔哩哔哩——青空の霞光