目录
- 一. 依赖管理
- Ⅰ. 部分dependency导入时为啥不需要指定版本?
- 1.1 父依赖启动器的工作
- 1.2 问题答案
- Ⅱ. 项目运行依赖的JAR包是从何而来的?
- 2.1 分析源码
- 2.2 问题答案
一. 依赖管理
Ⅰ. 部分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依赖启动器外,还提供了其他许多开发场景的相关依赖。