SpringBoot的pom.xml之依赖版本管理

2022-11-07 13:18:45 浏览数 (1)

目录

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-aObject-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.xmlObject-b:pom.xmlObject-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的形式也可以采用引入依赖的形式实现效果

0 人点赞