SpringBoot依赖管理的源码解析
作者:狮子也疯狂 发布时间:2022-10-29 23:37:14
一. 依赖管理
Ⅰ. 部分dependency导入时为啥不需要指定版本?
我们创建项目时添加的依赖并没有帮我们指定版本号<>,那SpringBoot是如何来指定版本账号的呢?
现在我们来剥析一下SpringBoot的父依赖启动器<>
<!--SpringBoot父项目依赖管理-->
<parent>
<artifactId>spring-boot-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.2.9.RELEASE</version>
<relativePath/><!-- 查看本地仓库的源码 -->
</parent>
1.1 父依赖启动器的工作
鼠标指针停留在spring-boot-parent上Ctrl + 鼠标左键点击进去,我们来看看这个父依赖启动器负责什么工作:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${revision}</version>
<relativePath>../spring-boot-dependencies</relativePath>
</parent>
首先进去发现:这个父依赖启动器有一个爸爸<>,如上!这个我们后面深入剥析!!!
然后接下看
<properties>
<main.basedir>${basedir}/../..</main.basedir>
<disable.checks>false</disable.checks>
<git.url>https://github.com/spring-projects/spring-boot</git.url>
<git.connection>scm:git:git://github.com/spring-projects/spring-boot.git</git.connection>
<git.developerConnection>scm:git:ssh://git@github.com/spring-projects/spring-boot.git</git.developerConnection>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.version>3.5.4</maven.version>
<maven-resolver.version>1.1.1</maven-resolver.version>
<spock.version>1.3-groovy-2.5</spock.version>
<spring-asciidoctor-extensions.version>0.4.0.RELEASE</spring-asciidoctor-extensions.version>
<spring-doc-resources.version>0.1.3.RELEASE</spring-doc-resources.version>
<spring-doc-resources.url>https://repo.spring.io/release/io/spring/docresources/spring-doc-resources/${spring-doc-resources.version}/spring-doc-resources-${spring-doc-resources.version}.zip</spring-doc-resources.url>
<testcontainers.version>1.12.5</testcontainers.version>
<testng.version>6.14.3</testng.version>
</properties>
看到这里进行了一个属性声明,声明了jdk版本,编码格式以及打包编译后的版本等;但是这里仅仅只是声明!!!
我们接着
这个部分是SpringBoot的插件管理
tips:
这里的<> 管理模块插件所需要的版本号,所以在我们在导入插件时,也不需要导入插件版本控制。
1.2 问题答案
我们Ctrl+鼠标右键点击<>,一进来就看到了一系列的版本号:
这里就声明了很多第三方框架的版本号,这里对应的是2.2.9.RELEASE的版本号,如果更改SpringBoot版本则这里的版本也会变化。但是正如前面所说,<>也还只是声明而已!!!
我们接着
决定项目不需要导入版本号的原因还得是<>
tips:
spring-boot-starter-parent 通过继承spring-boot-dependencies 从而实现了SprngBoot的本依赖营理,所以我的Springboot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了,这也就是在 Spring Boot 项目中部分依赖不需要写版本号的原因。
Ⅱ. 项目运行依赖的JAR包是从何而来的?
Spring-Boot-Starter-Parent父依赖启动器的主要作用是进行版本统一管理,那么项目运行依赖的JAR包是从何而来的?
2.1 分析源码
我们以<>为突破口,我们依旧是Ctrl+鼠标左键点进去,在spring-boot-starter-web里面很明显看到了一系列的依赖管理:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
我们只在pom.xml里面引入了spring-boot-starter-web一个依赖(也就是直接依赖了web依赖启动器),而里面依赖了tomcat,springmvc等等,则说明这个过程中进行了依赖传递,而我们点击任何一个web依赖启动器里面的依赖时发现,里面依然还有很多依赖,以tomcat为例:
里面仍然包含了启动tomcat所需要的全部依赖。
2.2 问题答案
到这里我们就可以知道spring-boot-starter-web依赖启动器的主要作用就是打包了Web开发场景所有的依赖(基于依赖传递的方式,加载当前仓库里对应的jar包)。
正是如此,在pom.xml中引入spring-boot-stater-web依赖启动器时,就可以实现Web场原开发,而不需要额外导入Tomcat服务战以及其他Web依赖文件等当然,这些引入的依赖文件的版本号还是由spring-boot-starter-parent父依赖进行的统一管理(这也是SpringBoot约定大于配置的一个重要体现)Spring Boot除了提供有上述介绍的Web依赖启动器外,还提供了其他许多开发场景的相关依赖。
来源:https://lions.blog.csdn.net/article/details/130383455


猜你喜欢
- 在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform、WPF中实现其实也很
- 单线程是安全的,因为线程只有一个,不存在多个线程抢夺同一个资源代码例子:public class SingleThread {int num
- 要完成一个轮播图片,首先想到的应该是使用ViewPager来实现。ViewPager已经有了滑动的功能,我们只要让它自己滚动。再加上下方的小
- 输入一个数组,然后颠倒次序进行输出,这种算法在程序开发
- Android开发,触控无处不在。对于一些 不咋看源码的同学来说,多少对这块都会有一些疑惑。View事件的分发机制,不仅在做业务需求中会碰到
- 前言CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。CMake可以说已经成为大部分C++开源项目标配
- 实现常驻通知栏时遇到的问题:无论如何就是不显示通知,查看日志发现貌似报错了:2020-06-28 14:11:34.923 6387-638
- java -version 命令大家都用过,大部分就是看下jdk版本或检查下环境变量的设置,但最后一行的信息也挺重要,如下图所示:Serve
- 读语句: String str = ConfigurationManager.AppSettings["DemoKey"
- idea手动刷新git分支相信很多小伙伴都遇到过这样的问题,在git上新建的分支却在idea的git分支中找不到又不知在哪里刷新,博主最近也
- 前天在做批量数据导入新增时,要对数据进行有效性判断,其中还要去除重复,如果没出现linq的话可能会新声明一个临时对象集合,然后遍历原始数据判
- 直接用英文逗号分隔就可以了,比如:inerface IHello { String sayHello(String name);
- 1. c语言中的整数类型有char, short, int, long等几种, 下面是C语言对每种数据类型长度的规定: (a). short
- 简介上一篇我们介绍了在android里如何读写本地文件。我们有一种场景,类似网页的cookie,要把用户的一些储如上一次登录、使用的痕迹等信
- 概述一天之计在于晨,每天的早餐也是必不可少,但是很多人为了节约时间,都是简单的吃点凑合一下或干脆不吃早餐,这对于个人身体和工作效率来说,无疑
- 一、项目结构二、pom.xml<?xml version="1.0" encoding="UTF-8&q
- 前言相信大家在使用spring的项目中,前台传递参数到后台是经常遇到的事, 我们必须熟练掌握一些常用的参数传递方式和注解的使用,本文将给大家
- 本文实例为大家分享了Android自定义View画天气预报折线图的具体代码,供大家参考,具体内容如下效果图如下:刚开始尝试用第三方画曲线的框
- 本文实例讲述了Spring实战之属性覆盖占位符配置器用法。分享给大家供大家参考,具体如下:一 配置文件<?xml version=&q
- Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Myba