Gradle学习-依赖引入
## 简介 Gradle作为项目构建工具,有很多与Maven相同功能,其中依赖管理是比较重要的项。
渲染中...
## 简介
Gradle作为项目构建工具,有很多与Maven相同功能,其中依赖管理是比较重要的项。
本次就来学习使用Gradle引入相关依赖。
<!-- more -->
## 回顾
上一篇文章【[Gradle学习-创建Springboot项目](https://oldmoon.top/post/67)】中,学习了使用不同的方式搭建Gradle-springboot项目,本片文章将在上篇的基础上,讲解Gradle的重要功能:**依赖管理**,
## dependencies
> 简述:在 Gradle 中,`dependencies` 配置项用于指定项目所依赖的外部库或模块。
>
> 官方文档:[DependencyHandler](https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.dsl.DependencyHandler.html)
### 基本语法
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.boot`和`io.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;
}
}
```
3. 编写基本配置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`,现象如下:

## 总结
最终服务启动成功并且接口测试成功,说明依赖正确注入并使用。通过使用Gradle进行依赖注入,可以发现以下两点:
1. Gradle对依赖管理的编写,相比Maven更加简洁。
2. Maven支持的依赖管理、依赖传递等行为,Gradle同样支持。
## 台阶
通过本文学习,对Gradle的依赖管理(引入)有了初步的认识,勉强算是迈上了一个台阶。
但还有很多不足之处,比如文中提到的依赖版本管理`version`,既然引入插件可以省略部分依赖的版本号配置,那么可不可以自己实现依赖版本管理,从而省略全部版本的配置?
答案当时是**可以**。Maven中就可以自定义依赖管理,Gradle怎么可能不行呢!这比分知识留给有兴趣的同学自行学习吧~(挖坑😁)
END
评论
登录后查看和发表评论
前往登录