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

news2024/12/24 21:26:33

为了让读者轻松掌握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进行多模块项目构建的相关教程中再做介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024视频编辑网站微服务

文章目录 项目描述流量数据算法主站服务AIGC功能服务视频剪辑服务任务调度服务算法部署服务 项目描述 一款海外视频编辑工具,提供视频编辑、多媒体资源的AI处理、AIGC生成素材等功能。 流量数据 数据: 月活MAU(过去30天活跃用户数)为500万,20%的用户每…

跳蚤市场小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,管理员管理,商品信息管理,论坛管理,收货地址管理,基础数据管理,轮播图信息 微信端账号功能包括:系统首页&a…

windows 达梦到ORACLE dblink

达梦通过DBLINK访问Oracle数据库有两种: 方式一:通过Oracle oci接口; 方式二:一种是通过ODBC数据源的方式。 本案例选择使用Oralce OCI的方式去访问Oracle数据库。 配置Oracle OCI客户端 下载地址:https://www.oracle.com/database/techno…

提升人事工作效率,打造智慧校园人事管理系统

智慧校园人事管理系统中的“人事工作”功能是为了提高校园内人力资源管理的效率和规范化水平,确保教职工队伍的健康发展。这一功能涵盖了从面试管理、职工培训、职工考核、职工体检、职称评定到职工关怀等多个方面,旨在全方位支持教职工的职业发展和个人…

没有mac电脑ios上架截屏截图的最新方法

很多人使用uniapp或其他跨平台框架开发ios的app,上架的时候都会遇到一个问题,上架的时候需要各种尺寸的设备来做ios截屏,比如目前最新的要求是,需要对6.7寸、6.5寸和5.5寸的iphone进行截屏,假如支持ipad则还需要对ipad…

MySQL多表查询练习(53题)

MySQL多表查询练习 学生表、教师表、课程表、分数表 1、查询语文比数学成绩高的学生的信息以及课程分数 2、查询语文比数学成绩低的学生的信息以及课程分数 3、查询语文等于数学成绩的学生的信息以及课程分数 4、查询平均成绩大于等于60分的同学的学生编号,学生姓名…

C语言:求阶乘倒数之和

(1)题目:求Sn11/21/3...1/n,保留4位小数。 (2)代码: #include "stdio.h" int main() {int n; // 整数ndouble sum 0.0; // 倒数之和printf("请输入一个整数:"…

探索AI与社交的交汇点:看Facebook如何引领智能化革命

在当今数字化时代,人工智能(AI)正成为各大科技公司变革的重要驱动力。作为全球领先的社交媒体平台,Facebook(现Meta Platforms)正处于这一智能化革命的前沿。通过不断创新和应用AI技术,Facebook…

气膜建筑的抗风与防火性能:保障仓储的安全—轻空间

气膜建筑以其独特的结构和材料优势,为仓储设施提供了可靠的安全保障。在应对自然灾害特别是强风和火灾时,气膜建筑展示了优异的抗风和防火性能。轻空间将详细探讨这些性能及其在实际应用中的表现。 气膜建筑的抗风能力源于其特殊的结构设计和高性能材料。…

【算法】普里姆算法解决修路问题

应用场景——修路问题 1.某地有 7 个村庄(A,B,C,D,E,F,G),现在需要修路把 7 个村庄连通 2.各个村庄的距离用边线表示(权),比如 A - …

学习日志8.7--防火墙安全策略

安全区域之间的数据流动方向,是根据安全级别的优先级来定义的,如果是从优先级高的地方到优先级低的地方,比如说从Local(100)发送到Trust(85)是outbound,如果是从优先级低的地方到优先…

回归预测|基于雪消融优化极端梯度提升树的数据回归预测Matlab程序SAO-XGBoost多特征输入单输出 含基础模型

回归预测|基于雪消融优化极端梯度提升树的数据回归预测Matlab程序SAO-XGBoost多特征输入单输出 含基础模型 文章目录 前言回归预测|基于雪消融优化极端梯度提升树的数据回归预测Matlab程序SAO-XGBoost多特征输入单输出 含基础模型 一、SAO-XGBoost模型二、实验结果三、核心代码…

SolidEdge二次开发(C#)-遍历装配体

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在SolidEdge中创建一个装配体模型3、遍历的代码 1、前言 SolidEdge二次开发过程中,针对装配体的遍历是采用递归方法来完成的,能获…

Android adb启动任意app的几种方式

使用adb启动应用程序主要有两种方式:一种是已知应用程序的包名和主Activity,另一种是不知道应用程序的包名和主Activity。 已知应用程序的包名和主Activity 在这种情况下,我们可以通过输入特定的adb命令来启动应用程序。具体步骤如下&#x…

STM32 GPIO 模块

B站视频地址:芯片内部GPIO模块细节 操作 LED 灯,4个步骤 使能 GPIO 模块(GPIO 模块,默认不工作)选择 PIN2 的功能:连接到 GPIO 模块配置 GPIO 模块,让引脚,作为输出引脚配置 GPIO …

kubernets学习笔记——kubernets的相关概念

目录 理解 Kubernets 技术1、什么是 Kubernets2、为什么使用 Kubernets Kubernets 重要概念1、先看 Kubernets 架构图2、集群(cluster)3、主节点(Master)  3.1、API 服务器(Kubernets API Server)  3.2…

VC 与 VS(visual studio) 的对应版本

VC 与 VS 对应版本的关系: VC9:对应的是 Visual Studio 2008 版本。在这个版本中,开发环境提供了一系列的新特性和改进,为开发者提供了更高效的编程体验。例如,增强了对 C 标准的支持,优化了调试工具等。 …

Postgresql数据库中通过函数实现将不确定列的数据插入到表中

在数据库操作中,经常会遇到需要将不确定列的数据插入到表中的情况。这个文章将详细介绍如何在 PostgreSQL 中通过函数来实现这一需求,记录一下。 一、需求概述 在实际应用中,可能会接收到一个包含数据的 JSON 字符串,需要将其插…

体外诊断 | 从说明书看研发:阳性判断值研究

来源于《甲型流感病毒、乙型流感病毒和新型冠状病毒(2019-nCoV) 核酸检测试剂盒(PCR-荧光探针法)审评报告》(CSZ2200276) 来源于《血清淀粉样蛋白A/C 反应蛋白二联检测试剂盒(荧光免…

vue3--实现vue2插件JSONPathPicker的路径获取功能

背景 最近在进行vue2项目升级为vue3。 在项目中需要获取json某些字段的路径,vue2中使用JSONPathPicker ,但是该插件不支持vue3,vue3中也没有相应的模块有该功能。 实现目标: 原vue2中JSONPathPicker实现的功能: 查…