SpringBoot通过maven引入的jar包为什么有的没有版本号

之前学习maven知道,在通过maven引入jar包的时候,需要明确定义其坐标元素groupId、artifactId、version、packaging、classfier,从而确认具体的jar包信息,其中groupId、artifactId、version三要素一定不可缺失,可是有些POM中却没有引入包版本,却可以正常运行,例如下图,那么是为什么呢?

SpringBoot通过maven引入的jar包为什么有的没有版本号_第1张图片
image

我们猜测肯定是有哪个地方有明确的包版本说明,要不然就违背了Maven的规则
其实在springboot的官方文档中也有具体解释这个没有设置包版本的原因,具体可看==>Spring Boot Docs

接下来我们具体分析下其真正的原因

SpringBoot通过maven引入的jar包为什么有的没有版本号_第2张图片
image

如上图,可以看到spring-boot-starter-tomcat是依赖自spring-boot-starters父maven的,其dependency中并没有明确的具体的jar包信息

如下图,再看spring-boot-starters包,其父maven是spring-boot-parent

SpringBoot通过maven引入的jar包为什么有的没有版本号_第3张图片
image

如下图spring-boot-parent的父pom是spring-boot-dependencies,看到这里通过名字应该很清楚在spring-boot-dependencies中肯定包含了大部分默认的jar包版本约定

SpringBoot通过maven引入的jar包为什么有的没有版本号_第4张图片
image

如下图的spring-boot-dependencies,并没有父POM


SpringBoot通过maven引入的jar包为什么有的没有版本号_第5张图片
image
SpringBoot通过maven引入的jar包为什么有的没有版本号_第6张图片
image

SpringBoot通过maven引入的jar包为什么有的没有版本号_第7张图片
image

从上图可以看出在spring-boot-dependencies中利用dependencyManagement管理了所有的jar包
现在也知道了spring-boot-starter-tomcat中的Tomcat版本是8.5.15

dependencyManagement 和 dependencys 有什么区别么?
主要的区别在于被dependencyManagement引入的jar包在子POM中不一定会引入,除非子类明确引入了才可以使用,而dependencys引入的jar包无论子POM是否有使用到都会引入进去的,这样可以做到避免引入没必要的jar包
更多maven的知识可以看看maven 学习

你可能感兴趣的:(SpringBoot通过maven引入的jar包为什么有的没有版本号)