目录
1、导语
2、parent做了什么事?
3、SpringBoot内部是怎么做的
3.1 官网创建版
3.2 阿里云创建版
4、小结
1、导语
今天这篇博客主要是讲SpringBoot是如何帮我们进行依赖的版本管理的。
首先我们打开 快速上手springBoot(IDEA联网版带图)_英杰的学习日记的博客-CSDN博客 创建好的项目,找到它的pom.xml文件,里面可以看一个parent属性,代码如下。
2、parent做了什么事?
我们在做项目的时候,避免不了的会导入一些相同的依赖比如说
Object-a:pom.xml
代码语言:javascript复制<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.9.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.2</version>
</dependency>
Object-b:pom.xml
代码语言:javascript复制<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.9.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.2</version>
</dependency>
现在,Object-a和Object-b他们都要用到这三个依赖,很正常吧,这属于常规操作。这时候有人就说了,你这东西都是一样的,还要写两份,别这么麻烦,来一份吧。
Object-gather:pom.xml
代码语言:javascript复制<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.9.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.2</version>
</dependency>
合成一个pom.xml:Object-gather:pom.xml。然后Object-a:pom.xml和Object-b:pom.xml用Object-gather:pom.xml的就行了。
Object-a:pom.xml
代码语言:javascript复制<dependency>
<groupId>com.jie</groupId>
<artifactId>Object-parent</artifactId>
<version>1.1.10</version>
</dependency>
Object-b:pom.xml
代码语言:javascript复制<dependency>
<groupId>com.jie</groupId>
<artifactId>Object-gather</artifactId>
<version>1.1.10</version>
</dependency>
这样不就简化了么?
哎,别急,这个管理还不太科学。
我们把Object-gather:pom.xml里的版本和坐标都集中管理一下,一分为二!
Object-parent:pom.xml
代码语言:javascript复制<properties>
<log4j-web.version>1.1.16</druid.version>
<disruptor.version>3.5.6</mybatis.version>
<mybatis-plus.version>5.1.47</mysql.version>
</propperties>
Object-gather:pom.xml
代码语言:javascript复制<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>>${log4j-web.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>${disruptor.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
我们在Object-parent:pom.xml 这个pom.xml文件中把常用的这些版本信息统一管理,写到一起,配置成Maven的属性,而Object-gather:pom.xml直接引用Object-parent:pom.xml的坐标,你看现在是不是专业了许多。
这样做有什么好处?你以后不用管版本号的事了!版本号这种事,它来帮你管。你说这又能帮我们做多少事呢?
太多了!以前的程序员做spring开发经常要做的一件事就是:调包。
调什么包?做团队项目的时候,七八个技术融合在一起的时候,我们可能用的包有冲突。假如我们都用mybatis-plus,我用的是5.1.47版本,他可能用到的是5.1.40的版本,这两个技术一块导进去,好,你告诉我,到底用5.1.47还是用5.1.40,这个时候就要调。那这个过程我告诉你,搞死人的!(夸张语句修饰一下哈)。
而现在呢?SpringBoot说,我来给你做一个全部版本统一管理,什么意思?它把所有的版本融合性给你测完了。跟你说,这几个版本放到一块是最好的,好了,以后呢版本的事你不用管了!
以后的开发就是
现在大家知道parent做了什么事了吧。
接下来让我们看看Spring Boot 到底是怎么做的呢?
3、SpringBoot内部是怎么做的
3.1 官网创建版
让我们打开 (1条消息) 快速上手springBoot(IDEA联网版带图)_英杰的学习日记的博客-CSDN博客 所创建的SpringBoot项目,找到pom.xml文件,打开。
现在,我们要用一下servlet-api,导一下这个包。
注意一下,这里我只写groupId和artifactId了,并没有写version。现在看上图,Maven现在还没有刷新,我们刷新一下。
刷完新,大家会发现,在这里,我并没有指定版本。但是它有(4.0.1)。这个版本谁帮我们指定了?
SpringBoot这个大管家!它帮我们指定了。问题来了,我们写的哪段代码带来的这个功能呢?
在这里我们发现这里有一个继承,就是它帮我们做的这件事!我们把鼠标放到spring-boot-starter-parent上,按住ctrl,点进去看一眼。
这里面的东西可真不少,有200多行代码,我们就看上图框起来的地方就好。这里呢它又继承了一个spring-boot-dependencies,我们再我们把鼠标放上去,按住Ctrl,点进入看看它有什么东西。
在这里我们看到了SpringBoot在这里定义了若干个坐标版本,我们找找我们的servlet-api在哪里。
快捷键Ctrl F。
找到了,现在我们知道了前面导入的servlet-api的版本从哪里来的了。
问题来了,我们之前导入依赖版本都要写<version>${}</version>来导入版本,让我们往下继续看看SpringBoot到底是怎么做的。
这里我电脑出了点问题有点红,不好意思哈)往下滑我们发现dependencyManagement,它定义了一系列的坐标依赖管理,让我们Ctrl F搜索一下
servlet-api.version
在这里我们就找到了servlet-api.version。这里它就是引用了上面的版本。
说的就简单一点,这里面它干了什么事呢?
它在这里面定义了一系列的属性 properties ,又定义了一系列的依赖管理 dependencyManagement。
然后我们再去导入的时候就不需要管理版本了,SpringBoot这个大管家已经帮我们指定好了。
3.2 阿里云创建版
SpringBoot快速入门(阿里云版带图)_英杰的学习日记的博客-CSDN博客 这篇博客上的SpringBoot项目我们是从阿里云上下载下来的。
打开它的pom.xml看一眼。
没有parent?那怎么办,那我们的版本管理这个功能岂不是没了?NO,我们往下看。
我们就会看到一个dependencyManagement的东西,看清楚它用的什么,它直接把spring-boot-dependencies给引用了。
说白了,我们官网创建的,是继承了用这个东西,阿里云直接把这块东西导进来了,效果呢是完全一样的。
4、小结
4.1 开发SpringBoot程序要继承spring-boot-starter-parent
4.2 spring-boot-starter-parent中定义了若干个依赖管理
4.3 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
4.4 继承parent的形式也可以采用引入依赖的形式实现效果