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

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

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java小卷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值