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

server/2024/10/18 23:27:34/

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

在这里插入图片描述

文章目录

    • gradle插件
      • 插件的作用
      • 插件应用的写法
    • 依赖配置类型
      • 作用范围
      • lombok依赖引入实践
      • developmentOnly
    • 附录
      • 内置依赖配置类型
      • 依赖配置类型的传递性

gradle_8">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中注释掉大部分配置:

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自带的内置任务:

在这里插入图片描述

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

./gradlew -b ./build.gradle tasks --all

在这里插入图片描述

动动小手

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

插件应用的写法

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

plugins {id 'java'id 'org.springframework.boot' version '3.3.2'id 'io.spring.dependency-management' version '1.1.6'
}

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

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

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做如下注释:

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!

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

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

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

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项目各基础插件提供的内置依赖配置类型的作用范围,这里笔者整理了一个表格以供参考:

typecompileClasspathruntimeClasspathtestCompileClasspathtestRuntimeClasspath
annotationProcessor
api
compileOnly
compileOnlyApi
implementation
runtimeOnly
testAnnotationProcessor
testCompileOnly
testImplementation
testRuntimeOnly

依赖配置类型的传递性

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


http://www.ppmy.cn/server/96570.html

相关文章

随手记1.0

easyexcel多级表头导出各级设置样式(继承HorizontalCellStyleStrategy实现) package com.example.wxmessage.entity;import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;…

Docker-容器修改

拷贝容器 修改 拷贝回去 第二种 示例

LeetCode 139. 单词拆分

更多题解尽在 https://sugar.matrixlab.dev/algorithm 每日更新。 组队打卡,更多解法等你一起来参与哦! LeetCode 139. 单词拆分,难度中等。 DP 解题思路: 使用 Set 来存储字典中的单词,这样可以在常数时间内检查一…

公司数据混乱怎么安全保存

当公司面临数据混乱的问题时,确保数据的安全保存变得尤为重要。 一、建立完善的数据管理制度 制定数据安全政策:企业应制定一套明确的数据安全政策,包括数据的分类、分级、存储、传输等方面的规定,以及数据的保管、使用和销毁等…

内网穿透--ICMP隧道转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网,然后由于私网IP的缘故,公网无法直接访问内部web服务器主机。通过内网其它主机做代理,穿透访问内网web服务器主机边界路由器或防火墙做静态NAT映射访问内网服务器inux主机,且策…

Qt:自定义钟表组件

使用QWidget绘制两种钟表组件,效果如下: 源码下载链接:GitHub - DengYong1988/Clock-Widget: Qt 自定义钟表组件 https://download.csdn.net/download/ouyangxiaozi/89616407 主要代码如下: ClockWgt.h #ifndef CLOCKWGT_H #d…

批量合并视频/图像,合并前重命名避免覆盖

血的教训:采用md5哈希算法时间戳重命名,避免覆盖 合并后就能安安心心排序了 import os import hashlib import shutil# 指定的源文件夹列表 source_dirs ["video/vox2/8-12/10s", "video/vox2/12-20/10s", "video/vox2/20-3…

探索 GPT-4o Mini:提升开发效率与创新能力的利器

探索 GPT-4o Mini:提升开发效率与创新能力的利器 随着人工智能技术的迅猛发展,OpenAI 最新发布的 GPT-4o Mini 模型以其卓越的性能和极具竞争力的价格引发了广泛关注。作为开发者,如何有效利用这一“迄今为止最具成本效益的小模型”来提升开…