2023-03-27
班门弄斧
00
请注意,本文编写于 604 天前,最后修改于 319 天前,其中某些信息可能已经过时。

目录

简介
回顾
dependencies
基本语法
其他用法
关键字
依赖类型
依赖范围
依赖传递
示例
引入依赖
拓展
编写代码
启动服务
测试接口
总结
台阶

简介

Gradle作为项目构建工具,有很多与Maven相同功能,其中依赖管理是比较重要的项。

本次就来学习使用Gradle引入相关依赖。

回顾

上一篇文章【Gradle学习-创建Springboot项目】中,学习了使用不同的方式搭建Gradle-springboot项目,本片文章将在上篇的基础上,讲解Gradle的重要功能:依赖管理

dependencies

简述:在 Gradle 中,dependencies 配置项用于指定项目所依赖的外部库或模块。

官方文档:DependencyHandler

基本语法

dependencies 配置项中可以包含多个依赖声明,每个依赖声明都可以指定依赖的库或模块的名称、版本、以及依赖的类型和范围。依赖声明的格式如下:

groovy
implementation 'group:name:version'

其中,implementation:表示依赖库需要在编译和运行时都可用;group 表示依赖库所属的组,name 表示依赖库的名称,version 表示依赖库的版本号。Gradle 支持使用通配符来指定版本号,例如:

groovy
implementation 'group:name:1.+'

这表示依赖库的版本号是以 1 开头的任意版本。

其他用法

除了上述基本语法格式,还可以使用以下格式来指定特殊的依赖项:

groovy
implementation files('libs/foo.jar') // 从本地文件系统中引入 jar 包 implementation project(':mylibrary') // 引入另一个 Gradle 项目(多模块项目时常用)

关键字

上面的用法都是使用的implementation关键字,使用该关键字引入的依赖表示需要在编译和运行时都可用,除此之外还有其他关键字,按依赖类型和依赖范围划分如下:

依赖类型

  • implementation:表示依赖库需要在编译和运行时都可用;
  • api:表示依赖库需要在编译时可用,但不一定需要在运行时可用;
  • runtimeOnly:表示依赖库只需要在运行时可用,不需要在编译时可用;
  • testImplementation:表示依赖库只需要在测试代码编译和运行时可用;
  • testRuntimeOnly:表示依赖库只需要在测试代码运行时可用。

依赖范围

  • compileOnly:表示依赖库不会被打包到最终的构建结果中,但可以在编译时使用;
  • annotationProcessor:表示依赖库只用于编译期的注解处理;
  • runtimeOnly:表示依赖库只需要在运行时可用,不需要在编译时可用;
  • testCompileOnly:表示依赖库只会被用于测试代码的编译,不会被打包到最终的构建结果中;
  • testRuntimeOnly:表示依赖库只需要在测试代码运行时可用。

依赖传递

引入的依赖可以配置其传递性,Maven中也存在响应配置,Gradle中的写法如下:

groovy
implementation ('group:name:version') { transitive = true // 允许传递依赖(默认值),false:禁止传递依赖 }

示例

上一篇文章创建好了springboot项目,如果你启动测试会发现,启动虽然成功,但立即自动结束了,这是因为没有web服务的相关依赖,导致其没有作为web服务器从而一直保持运行。

本示例为:使用implementation引入spring-boot-starter-web,并编写一个 http 接口用于测试。

引入依赖

修改build.gradle文件中的dependencis如下:

groovy
dependencies { implementation 'org.springframework.boot:spring-boot-starter', 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' }

其中多个依赖可以用,间隔,使用一个implementation即可,等价于下面的配置:

groovy
dependencies { implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' }

修改后刷新依赖(上一篇文章在项目初始化时有讲到),如果使用IDEA,在build.gradle文件修改后,右上角会自动出现刷新提示按钮,点击即可刷新。

拓展

细心的朋友可以发现,implementation 'org.springframework.boot:spring-boot-starter'与上面讲到的基本语法有所区别,org.springframework.boot是group,spring-boot-starter是name,那么version 去哪了?

答案是:省略了

但需要注意的是,并不是所有依赖项都可以省略版本号,这里可以省略version版本号的编写,是因为在plugins中引入了相关插件:org.springframework.bootio.spring.dependency-management,这些插件中有一个重要的作用,就是维护了springframeword众多依赖的版本。

顾名思义dependency-management就是依赖管理的意思,如果你的某个依赖没有被这些插件所维护管理,那么引入那个依赖就必须填写版本号,否则会报错!

编写代码

  1. 编写TestController

创建controller包,并创建TestController类,编写代码如下:

java
package com.example.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 测试 http 接口 * * @author dingdangdog * @date 2023/3/27 16:38 */ @RestController @RequestMapping("/test") public class TestController { @GetMapping public String hello(String name) { return "Hello " + name; } }
  1. 编写基本配置application.yml

src/main/resources文件夹下创建application.yml文件,该文件是Springboot默认的配置文件,也可以是application.properties,写法不同而已。

application.yml内容如下

yaml
server: port: 8080 spring: application: name: gradle-boot-my

启动服务

以上工作完成后,运行SpringBoot的启动类即可,启动日志如下:

log
"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" ... Connected to the target VM, address: '127.0.0.1:13446', transport: 'socket' . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.9) 2023-03-27 16:44:37.878 INFO 19252 --- [ main] com.example.BootApplication : Starting BootApplication using Java 1.8.0_131 on DESKTOP-M8KVEAO with PID 19252 (E:\code\DingDangDog_sapce\gradle-boot-my\build\classes\java\main started by xxhu5 in E:\code\DingDangDog_sapce\gradle-boot-my) 2023-03-27 16:44:37.882 INFO 19252 --- [ main] com.example.BootApplication : No active profile set, falling back to 1 default profile: "default" 2023-03-27 16:44:38.651 INFO 19252 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2023-03-27 16:44:38.659 INFO 19252 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2023-03-27 16:44:38.659 INFO 19252 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.71] 2023-03-27 16:44:38.754 INFO 19252 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2023-03-27 16:44:38.754 INFO 19252 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 824 ms 2023-03-27 16:44:39.051 INFO 19252 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2023-03-27 16:44:39.060 INFO 19252 --- [ main] com.example.BootApplication : Started BootApplication in 1.6 seconds (JVM running for 2.592) 2023-03-27 16:45:07.066 INFO 19252 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2023-03-27 16:45:07.066 INFO 19252 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2023-03-27 16:45:07.067 INFO 19252 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms

观察日志可以看到服务以8080端口启动成功。

测试接口

浏览器访问http://localhost:8080/test?name=dingdangdog,现象如下:

test-api

总结

最终服务启动成功并且接口测试成功,说明依赖正确注入并使用。通过使用Gradle进行依赖注入,可以发现以下两点:

  1. Gradle对依赖管理的编写,相比Maven更加简洁。
  2. Maven支持的依赖管理、依赖传递等行为,Gradle同样支持。

台阶

通过本文学习,对Gradle的依赖管理(引入)有了初步的认识,勉强算是迈上了一个台阶。

但还有很多不足之处,比如文中提到的依赖版本管理version,既然引入插件可以省略部分依赖的版本号配置,那么可不可以自己实现依赖版本管理,从而省略全部版本的配置?

答案当时是可以。Maven中就可以自定义依赖管理,Gradle怎么可能不行呢!这比分知识留给有兴趣的同学自行学习吧~(挖坑😁)

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:DingDangDog

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!