«

SpringBoot依赖管理源码分析

时间:2024-7-3 13:29     作者:韩俊     分类: Java


这篇文章主要介绍“SpringBoot依赖管理源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot依赖管理源码分析”文章能帮助大家解决问题。

一. 依赖管理

Ⅰ. 部分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-parentCtrl + 鼠标左键点击进去,我们来看看这个父依赖启动器负责什么工作:

<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依赖启动器外,还提供了其他许多开发场景的相关依赖。

标签: java spring

热门推荐