首页 > 其他分享 >Maven依赖版本更新踩坑

Maven依赖版本更新踩坑

时间:2024-06-19 21:12:03浏览次数:12  
标签:依赖 spring boot caffeine Maven xx 版本 组件

问题描述

项目xx基于Spring Boot框架,其<parent>配置如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.2</version>
    <relativePath />
</parent>

spring-boot-dependencies-2.4.2.pom中通过<dependencyManagement>配置的caffine版本为2.8.8

<properties>
    <caffeine.version>2.8.8</caffeine.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>${caffeine.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

项目yy是一个基础的Maven模块,在其pom.xml中添加了3.1.8版本的caffeine配置。

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>3.1.8</version>
</dependency>

此时在xx项目中添加对yy模块的依赖,即:

<dependency>
    <groupId>x.y.z</groupId>
    <artifactId>yy</artifactId>
    <version>1.0</version>
</dependency>

至此,重新梳理下xx,yy,Spring Boot以及caffeine的依赖关系如下:

如上图,按照对Maven传递依赖的理解,此时在xx项目中使用的caffeine版本应该是在yy项目中配置的3.1.8,但实际结果却是使用的spring-boot-dependencies-2.4.2.pom中定义的2.8.8

这显示不是我们期望的结果!

解决办法

经过实验发现,凡是在<parent>中通过<dependencyManagement>管理的组件版本优先级都比向下依赖的组件版本优先级高。
那么当我们需要修改组件版本以覆盖在<parent>定义的组件版本时,该怎么实现呢?根据不同的情况有2种办法。

版本定义覆盖

这种解决办法适用于:
1.项目的<parent>直接设置为通过<dependencyManagement>管理组件的模块
2.在<parent>中通过<properties>定义了组件版本

示例:
spring-boot-dependencies-2.4.2.pom中通过<dependencyManagement>配置的caffine版本为2.8.8

<properties>
    <caffeine.version>2.8.8</caffeine.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>${caffeine.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

xx项目的<parent>设置为spring-boot-starter-parent

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.2</version>
    <relativePath />
</parent>

<properties>
    <caffeine.version>3.1.8</caffeine.version>
</properties>

xx<properties>重新定义<caffeine.version>为新版本号,如:3.1.8,此时将会使用在xx中定义的<caffeine.version>3.1.8)覆盖在spring-boot-dependencies-2.4.2.pom中定义的<caffeine.version>2.8.8),也就达到了更新组件版本的目的。

重新依赖组件

倘若项目的<parent>不是直接设置为通过<dependencyManagement>管理组件的模块,或者在<parent>中没有通过<properties>定义组件版本,那么此时就只能在项目中重新依赖组件及版本了,这样也能达到覆盖在<parent>中定义的组件版本的目的。
场景1:项目的<parent>不是直接设置为通过<dependencyManagement>管理组件的模块

<!-- 没有直接将Spring Boot设置为parent -->
<parent>
    <artifactId>test-java-samples</artifactId>
    <groupId>org.chench.extra</groupId>
    <version>1.0</version>
</parent>
<!-- Spring Boot通过dependencyManagement引入 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.4.2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

场景2:在<parent>中未通过<properties>中定义了组件版本

<!-- 在parent中未定义版本property -->
<!-- 自然也就无法通过重新定义property来达到覆盖版本的目的 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>2.8.8</version>
        </dependency>
    </dependencies>
</dependencyManagement>

xx项目中重新依赖组件,以达到版本更新的目的。

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>3.1.8</version>
</dependency>

使用该方式解决的版本更新问题,依靠的是版本优先级的机制。

完毕!

【参考】
记录一次Maven依赖传递,模块之间依赖版本不一致问题
覆盖 Spring Boot 依赖的版本号

标签:依赖,spring,boot,caffeine,Maven,xx,版本,组件
From: https://www.cnblogs.com/nuccch/p/18257390

相关文章

  • 枫叶冒险岛免费版本
    软件功能简介本软件作者经过多年测试最终迎来目前最强的版本现在目前市场有很多杂七杂八的版本,那些小牌软件封号太严重所以劝大家,花钱要花在刀刃上,不要盲目的去跟风,至少要找一款适合自己的安全稳定的软件去使用。很多代理商或者一些作者一直在诋毁我们,我们也无所畏惧,只......
  • 1950 Springboot汽修技能点评系统idea开发mysql数据库APP应用java编程计算机网页源码m
    一、源码特点 springboot汽修技能点评系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSPjava编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。前段主要技术bootstrap.cssjquery......
  • Spring是如何通过三级缓存解决循环依赖的
    Spring是如何利用三级缓存解决循环依赖的转载自:https://www.cnblogs.com/xw-01/p/17561035.html1.定义问题1.1什么是循环依赖其实好理解,就是两个Bean互相依赖,类似下面这样:@ServicepublicclassAService{ @Autowired BServicebService;}@ServicepublicclassBSer......
  • 在Vue 2中使用Swiper,你需要安装与Vue 2兼容的Swiper版本
    在Vue2中使用Swiper,你需要安装与Vue2兼容的Swiper版本,并且通常还需要安装vue-awesome-swiper这个Vue组件来更方便地集成Swiper。以下是如何在Vue2项目中使用Swiper的步骤:1.安装Swiper和vue-awesome-swiper首先,你需要通过npm或yarn来安装Swiper和vue-awesome-swiper。确保安......
  • CUDA 版本查看
    查看cuda版本的指令:nvidia-smincvv-Vpython-c"importtorch;print(torch.version.cuda)"nvidia-smi(base)liuliu@liuliu-Legion-Y9000P-IAH7H:~/EchoFusion$nvidia-smiMonJan1511:14:412024+--------------------------------------------------......
  • update 修改数据时,依赖或者说需要根据另一个值来进行判断l
    在这点我们需要使用到的sql语句 语法:update表名set某个值=casewhen@你要修改的值>表中的某一个值then成立之后要设置的值else前面没有成立设置的值end举例: 我根据传入的年龄age来设置type为1还是0,1表示成年,0表示未成年updateTablesetname=@name,type=case......
  • Maven入门教程
    Maven是一款基于Java平台的项目管理和整合工具,它极大地简化了项目的开发、构建、测试、打包和部署过程。以下是Maven的详细教程,内容涵盖了从安装到部署的各个主要步骤:一、Maven的简介Maven诞生于2001年3月左右,由JasonVanZyl创立。它将项目的开发和管理过程抽象成一个项......
  • UniformSpacingPanel Avalonia版本
    UniformSpacingPanel是HandyControl非常好用的一个容器,具备自动换行、等间距等特性,我一直用它来作为控制栏、属性编辑窗口的容器。刚看了下HandyControl官网甚至没有文档…UniformSpacingPanel真的是一个非常好用的容器,可以像StackPanel一样设置元素向某一个方向排列,并且......
  • C语言开发日志,问题记录(长期更新版本)
    一、程序存储与占用1.编译后内存分配编译后的Code(代码),RO-data(只读,譬如const),RW-data(读写,初始化非0的全局变量),存储在ROM(flash)中,ZI-data(初始化为0或者未初始化的变量),运行时ROM占用是Code+RO-data+RW-data运行时RAM占用是RO-data+RW-data+ZI-data;RW和ZI会被......
  • Asp.net Core依赖注入(Autofac替换IOC容器)
    ASP.NETCoreASP.NETCore(previouslyASP.NET5)改变了以前依赖注入框架集成进ASP.NET的方法.以前,每个功能-MVC,WebAPI,等.-都有它自己的"依赖解析器(dependencyresolver)"机制并且只是'钩子'钩住的方式有些轻微的区别.ASP.NETCore通过Microsoft.Extensions.......