避免版本冲突:Spring Boot项目中正确使用Maven的DependencyManagement

最近在做一个SpringBoot项目jar包升级的时候,忽略了Maven中dependencyManagement和dependencies元素的区别,导致线上出现了问题。今天,我们就来聊聊这两者的区别。

  1. dependencyManagement元素的应用场景

当我们在开发一个大型的后端项目时,模块通常很多,我们会使用Maven或者Gradle来管理项目,我们项目使用的是Maven。

项目中的每个模块通常都会依赖很多jar包,当jar包越来越多时,通常会把每个模块用到的公共的jar包提取出来,构建父POM文件。在父POM中,我们会使用dependencyManagement元素来管理包的版本。如此一来,子项目或者模块直接在直接引用jar包的依赖,不需要在指定版本号,下面是一个典型的父POM(pom.xml)。

XML 复制代码
<dependencyManagement>
        <dependency>
             <groupId>com.alibaba.fastjson2</groupId>
             <artifactId>fastjson2</artifactId>
             <version>2.0.39</version>
        </dependency>
        <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>transmittable-thread-local</artifactId>
             <version>2.12.1</version>
        </dependency>
</dependencyManagement>

假设我们有一个模块来引用父POM,配置如下所示:

XML 复制代码
    <!--继承父POM-->
    <parent>
        <groupId>com.lixiang.vehicle.framework</groupId>
        <artifactId>vehicle-framework-bom</artifactId>
        <version>1.0.0.0</version>
    </parent>

    <groupId>com.customer.api</groupId>
        <name>customer</name>
    <packaging>pom</packaging>

    <dependencies>
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>transmittable-thread-local</artifactId>
        </dependency>
    </dependencies>

这样做的好处是:通过**父POM可以统一管理项目依赖所有公共jar包的版本,确保项目的各个模块依赖的jar包版本的一致。**如此一来,在服务的jar包版本升级时,只需要升级父POM管理的jar包版本,子项目或者子模块就会自动生效,而不需要按个升级每个子项目的jar版本。

  1. dependencies元素的特性

不管是父POM还是子项目或者子模块的POM,只要是在dependencies元素内部所定义的jar包,均会自动引入,并且这些依赖还会被子项目全部继承。

  1. dependencyManagement和dependencies区别

dependencyManagement用于集中管理依赖的版本,并不实际引入,而dependencies用于实际引入依赖

假如父POM和子项目的pom文件中都引入了一个共同的jar包,但是版本号不一样?那么子项目实际生效的版本是哪一个呢?答案是子项目引入的jar包版本。因此,子项目或者子模块想要使用父POM管理的jar包,直接引入即可,不需要指定版本号。

相关推荐
二哈喇子!2 小时前
若依【(前后端分离版)SpringBoot+Vue3】
java·spring boot·后端
paopaokaka_luck2 小时前
婚纱摄影管理系统(发送邮箱、腾讯地图API、物流API、webSocket实时聊天、协同过滤算法、Echarts图形化分析)
vue.js·spring boot·后端·websocket·算法·echarts
Monkey-旭5 小时前
Android Handler 完全指南
android·java·handler
秃狼5 小时前
Execel文档批量替换标签实现方案
java
Brookty5 小时前
Java线程安全与中断机制详解
java·开发语言·后端·学习·java-ee
Sylvia-girl5 小时前
排序查找算法,Map集合,集合的嵌套,Collections工具类
java·算法·排序算法
TT哇5 小时前
【分治】归并排序——排序数组(medium)
java·算法·排序算法
给力学长6 小时前
自习室预约小程序的设计与实现
java·数据库·vue.js·elementui·小程序·uni-app·node.js
试着6 小时前
零基础学习性能测试第五章:JVM性能分析与调优-JVM概念,java程序运行原理
java·jvm·学习·零基础·性能测试
從南走到北6 小时前
JAVA东郊到家按摩服务同款同城家政服务按摩私教茶艺师服务系统小程序+公众号+APP+H5
android·java·开发语言·微信小程序·小程序