Spring Boot 3.x gradle脚手架工程build.gradle详解

为了让读者轻松掌握gradle项目构建脚本中各种配置,我们将从0开始一点点启用配置,以做实验的尝试方式,让大家对各种配置的作用有比较深的印象。如果觉得对你有帮助,记得点赞收藏,关注小卷,后续更精彩!

文章目录

gradle插件

gradle项目构建各种任务的执行都离不开插件,比如要构建java项目,需要java相关插件的支持;同理要构建spring boot插件,则需要spring boot插件的支持。

插件的作用

实验步骤:

  1. 把插件都注释掉,看到java { ... }配置报错。
  2. java { ... }注释掉,再把configurations { ... }中的内容注释掉,看控制台的报错。说明依赖配置类型也是依赖插件的。
  3. 再把 dependencies { ... }注释掉,发现test任务不存在,而把java插件打开,错误消失,说明test任务是java插件提供的。
  4. 打开java插件,发现developmentOnly依赖类型报错,
  5. org.springframework.boot加上,现在的错误是版本没了,找不到
  6. 把依赖管理插件再加上。

实验目的:体会各个插件对相关配置的影响

插件中包含相关的任务,下面进行实验,看一看各个插件所包含的任务:

先在build.gradle中注释掉大部分配置:

groovy 复制代码
plugins {
//    id 'java'
//    id 'org.springframework.boot' version '3.3.2'
//    id 'io.spring.dependency-management' version '1.1.6'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

//java {
//    toolchain {
//        languageVersion = JavaLanguageVersion.of(17)
//    }
//}

configurations {
//    compileOnly {
//        extendsFrom annotationProcessor
//    }
//    // 实现依赖范围配置的局部扩展
//    testCompileOnly {
//        extendsFrom testAnnotationProcessor
//    }
}

dependencies {
//    implementation 'org.springframework.boot:spring-boot-starter-web'
//    compileOnly 'org.projectlombok:lombok'
//    developmentOnly 'org.springframework.boot:spring-boot-devtools'
//    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
//    annotationProcessor 'org.projectlombok:lombok'
//    // 为单元测试环境引入和启用lombok编译功能
//    testAnnotationProcessor 'org.projectlombok:lombok'
//    testImplementation 'org.springframework.boot:spring-boot-starter-test'
//    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

//tasks.named('test') {
//    useJUnitPlatform()
//}

//tasks.register('runBootJar', JavaExec) {
//    classpath = files('build/libs/demo-0.0.1-SNAPSHOT.jar')
//}

刷新gradle配置,构建没有问题。可以看到gradle自带的内置任务:

也可以在命令行执行所有任务列表的查看:

shell 复制代码
./gradlew -b ./build.gradle tasks --all

动动小手

把执行的结果放到一个文件中方便比较。放开java插件再执行下,并记录结果;再把插件都放开执行下,并记录结果。再对比下。

插件应用的写法

插件可以在plugins { ... }中进行声明和应用。比如脚手架默认生成的插件应用如下:

groovy 复制代码
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.3.2'
    id 'io.spring.dependency-management' version '1.1.6'
}

注意,这里第三方的插件需要提供version

除这种方式,还有一种apply应用方式,笔者更倾向这种写法:

groovy 复制代码
plugins {
//    id 'java'
    id 'org.springframework.boot' version '3.3.2' apply false
//    id 'io.spring.dependency-management' version '1.1.6'
}

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

这里只需要对必要的插件放在plugins { ... }中声明,而无需应用,设置apply false,在下面通过apply plugin: 进行应用,这样的好处是:这里org.springframework.boot插件潜在关联的io.spring.dependency-management插件不再需要显式指定关联的版本了。

依赖配置类型

依赖配置类型是gradle中引入依赖时采用的一种配置类型,它决定了依赖被引入在哪个或者哪些类路径上。看下4种类路径(idea的gradle插件视图)。

作用范围

下面开始实验,来观察下各种配置类型在相关类路径上的作用范围。先对build.gradle做如下注释:

groovy 复制代码
configurations {
//    compileOnly {
//        extendsFrom annotationProcessor
//    }
//    // 实现依赖范围配置的局部扩展
//    testCompileOnly {
//        extendsFrom testAnnotationProcessor
//    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
//    compileOnly 'org.projectlombok:lombok'
//    developmentOnly 'org.springframework.boot:spring-boot-devtools'
//    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
//    annotationProcessor 'org.projectlombok:lombok'
//    // 为单元测试环境引入和启用lombok编译功能
//    testAnnotationProcessor 'org.projectlombok:lombok'
//    testImplementation 'org.springframework.boot:spring-boot-starter-test'
//    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

放开:implementation 'org.springframework.boot:spring-boot-starter-web',刷新gradle,观察下现在类路径的情况。

实验发现:implementation依赖配置类型引入的依赖在四种Classpath上都作用了,并且我们看到关于starter依赖的特点,它会利用依赖传递特性将封装的其他starter起始依赖和具体的依赖作为一个提供某种框架能力的整体包含进来。

动动小手

  1. 放开:testImplementation 'org.springframework.boot:spring-boot-starter-test',刷新gradle,观察下现在类路径的情况,说明testImplementation配置类型的作用范围

  2. 放开:compileOnly 'org.projectlombok:lombok',观察它的作用范围

lombok依赖引入实践

做本实验前,先做这样的配置:

把单元测试注释掉

确保无编译错误。

写一个应用lombok注解的实体类Student

有编译错误,很显然要进行相关引入:compileOnly 'org.projectlombok:lombok'。这里用compileOnly表明该依赖只需要引入到编译类路径上。然后,我们把gradle设置的构建方式从先前的IntelliJ Idea改回gradle方式:

运行报错,是因为gradle的编译并没有使用注解处理器来生成指定构造器的字节码。

需要使用annotationProcessor依赖配置类型来引入依赖,这样gradle编译任务对该依赖中注解元数据编译处理才会交给相应的注解处理器。

放开:annotationProcessor 'org.projectlombok:lombok',再次运行ok!

为避免多次引入同一个依赖,可以适当的采用依赖配置的继承:

groovy 复制代码
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}
...

dependencies {
    ...
//    compileOnly 'org.projectlombok:lombok'
...
    annotationProcessor 'org.projectlombok:lombok'
    ...
}

这样对同一个依赖无需使用不用的依赖配置类型引入多次了。同理,想要在单元测试环境下使用lombok,你自然想到进行如下配置:

groovy 复制代码
configurations {
    ...
    testCompileOnly {
        extendsFrom testAnnotationProcessor
    }
}

dependencies {
    ...
    // 为单元测试环境引入和启用lombok编译功能
    ...
}

现在放开:annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'的注释,现在你就知道了,结合继承,原来它会把spring-boot-configuration-processor引入编译类路径,并在编译它的配置时用上相应的注解处理器。

developmentOnly

最后再放开developmentOnly 'org.springframework.boot:spring-boot-devtools',在spring boot3之前的boot插件并没有内置这个依赖配置类型,而是采用自定义的方式。关于自定义依赖配置类型,就是从现有的内置依赖配置类型或者四种Classpath作用域进行扩展,实际中使用场景不太多,这里就不过多介绍。

developmentOnly 的作用就是,把依赖引入到runtimeClasspath,来支持本地运行时发挥作用,而不会把依赖打包到发布包中,这很适用于本地开发需要的工具集,比如服务的热启动,后面会讲。

自己动手

读者可以自己动手,使用bootJar任务打包,观察developmentOnly方式引入的依赖会不会打包到可执行jar压缩包中。

附录

内置依赖配置类型

关于gradle构建的spring boot项目各基础插件提供的内置依赖配置类型的作用范围,这里笔者整理了一个表格以供参考:

type compileClasspath runtimeClasspath testCompileClasspath testRuntimeClasspath
annotationProcessor
api
compileOnly
compileOnlyApi
implementation
runtimeOnly
testAnnotationProcessor
testCompileOnly
testImplementation
testRuntimeOnly

依赖配置类型的传递性

该内容这里暂不做介绍,在使用gradle进行多模块项目构建的相关教程中再做介绍。

相关推荐
.柒宇.2 小时前
力扣hoT100之找到字符串中所有字母异位词(java版)
java·数据结构·算法·leetcode
唐小码2 小时前
Redis RedisTimeSeries 在springboot中的应用
spring boot·redis·后端
回家路上绕了弯3 小时前
高并发订单去重:布隆过滤器过滤已存在订单号的实战方案
分布式·后端
刘一说3 小时前
Spring Boot 应用的云原生 Docker 化部署实践指南
spring boot·docker·云原生
申阳3 小时前
Day 11:集成百度统计以监控站点流量
前端·后端·程序员
拂晓银砾3 小时前
Java 连接数据库
java
Cache技术分享3 小时前
239. Java 集合 - 通过 Set、SortedSet 和 NavigableSet 扩展 Collection 接口
前端·后端
demonre3 小时前
阿里云 Debian 13.1 安装 docker 并切换阿里云镜像源
后端·docker
武子康3 小时前
大数据-152 Apache Druid 集群模式 [下篇] 低内存集群实操:JVM/DirectMemory与启动脚本
大数据·后端·nosql
青衫码上行3 小时前
【Java Web学习 | 第九篇】JavaScript(3) 数组+函数
java·开发语言·前端·javascript·学习