当前位置: 首页 > news >正文

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

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

在这里插入图片描述

文章目录

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

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进行多模块项目构建的相关教程中再做介绍。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux: 进程概念详解
  • DataX PostgreSQL 读写支持Geometry类型
  • 【C#】读取与写入txt文件内容
  • Redis中zset结构的常用命令总结
  • HTTP、HTTPS、SOCKS5三种协议特点
  • spring boot 笔记大杂烩
  • 【ARM】CMSIS 软件标准接口
  • 回归预测|基于灰狼优化GWO-Transformer-BiLSTM组合模型的数据回归预测Matlab程序 多特征输入单输出
  • 前端(三):Ajax
  • 【Linux】Linux环境基础开发工具使用之软件包管理(yum)与 Linux编辑器(vim)
  • 力扣面试经典100题
  • php7.2后解密微信推送过来的数据
  • 使用 Java RestClient 与 Elasticsearch 进行商品文档操作
  • 进阶SpringBoot之 Thymeleaf 模板引擎
  • MySQL:复杂查询(一)——聚合函数分组查询联合查询01
  • [PHP内核探索]PHP中的哈希表
  • android图片蒙层
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • dva中组件的懒加载
  • GitUp, 你不可错过的秀外慧中的git工具
  • maven工程打包jar以及java jar命令的classpath使用
  • MaxCompute访问TableStore(OTS) 数据
  • maya建模与骨骼动画快速实现人工鱼
  • MQ框架的比较
  • mysql 数据库四种事务隔离级别
  • php ci框架整合银盛支付
  • spring boot 整合mybatis 无法输出sql的问题
  • spring security oauth2 password授权模式
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • vue-router的history模式发布配置
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 技术:超级实用的电脑小技巧
  • 坑!为什么View.startAnimation不起作用?
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用docker-compose进行多节点部署
  • 运行时添加log4j2的appender
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​数据链路层——流量控制可靠传输机制 ​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #在 README.md 中生成项目目录结构
  • (1)Nginx简介和安装教程
  • (20050108)又读《平凡的世界》
  • (39)STM32——FLASH闪存
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (生成器)yield与(迭代器)generator
  • (算法)大数的进制转换
  • (学习总结16)C++模版2
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .equals()到底是什么意思?
  • .Net Core与存储过程(一)
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET4.0并行计算技术基础(1)