为了让读者轻松掌握gradle
项目构建脚本中各种配置,我们将从0开始一点点启用配置,以做实验的尝试方式,让大家对各种配置的作用有比较深的印象。如果觉得对你有帮助,记得点赞收藏,关注小卷,后续更精彩!
文章目录
- gradle插件
- 插件的作用
- 插件应用的写法
- 依赖配置类型
- 作用范围
- lombok依赖引入实践
- developmentOnly
- 附录
- 内置依赖配置类型
- 依赖配置类型的传递性
gradle插件
gradle
项目构建各种任务的执行都离不开插件,比如要构建java
项目,需要java
相关插件的支持;同理要构建spring boot
插件,则需要spring boot
插件的支持。
插件的作用
实验步骤:
- 把插件都注释掉,看到
java { ... }
配置报错。 - 把
java { ... }
注释掉,再把configurations { ... }
中的内容注释掉,看控制台的报错。说明依赖配置类型也是依赖插件的。 - 再把
dependencies { ... }
注释掉,发现test
任务不存在,而把java
插件打开,错误消失,说明test
任务是java
插件提供的。 - 打开
java
插件,发现developmentOnly
依赖类型报错, - 把
org.springframework.boot
加上,现在的错误是版本没了,找不到 - 把依赖管理插件再加上。
实验目的:体会各个插件对相关配置的影响
插件中包含相关的任务,下面进行实验,看一看各个插件所包含的任务:
先在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
起始依赖和具体的依赖作为一个提供某种框架能力的整体包含进来。
动动小手
放开:
testImplementation 'org.springframework.boot:spring-boot-starter-test'
,刷新gradle,观察下现在类路径的情况,说明testImplementation
配置类型的作用范围放开:
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
项目各基础插件提供的内置依赖配置类型的作用范围,这里笔者整理了一个表格以供参考:
type | compileClasspath | runtimeClasspath | testCompileClasspath | testRuntimeClasspath |
---|---|---|---|---|
annotationProcessor | ||||
api | ✔ | ✔ | ✔ | ✔ |
compileOnly | ✔ | |||
compileOnlyApi | ✔ | ✔ | ||
implementation | ✔ | ✔ | ✔ | ✔ |
runtimeOnly | ✔ | ✔ | ||
testAnnotationProcessor | ||||
testCompileOnly | ✔ | |||
testImplementation | ✔ | ✔ | ||
testRuntimeOnly | ✔ |
依赖配置类型的传递性
该内容这里暂不做介绍,在使用gradle
进行多模块项目构建的相关教程中再做介绍。