项目引入多个连接池,导致使用其他连接池,maven分析学习

第一步在命令行中执行

mvn  dependency:tree > excludeParentstart.log

如果你的settings文件不是项目使用的setting配置,那么就使用下面的命令

mvn -gs 你的路径/apache-maven-3.8.2/conf/settings-person.xml dependency:tree > excludeParentstart.log

然后打开这个输出的 excludeParentstart.log文件

然后得到了一堆密密麻麻的文件

这个玩意怎么看呢?我们得先知道依赖加载顺序

  • 执行命令 mvn dependency:tree
    会输出Maven项目的依赖树,展示所有的依赖项和它们之间的关系。以下是加载顺序的一些概念和说明:

    父级依赖(Parent
    dependency):在Maven项目中,可以通过定义一个父级POM来集中管理一些通用依赖和配置,子模块POM继承了父级POM后就可以共享这些依赖和配置。因此,父级依赖会首先被加载,并且其依赖会在所有子模块之前被解析和加载。

    子模块依赖(Child module dependency):子模块的依赖会在其父级依赖和其他已经解析过的依赖之后被加载。

    传递性依赖(Transitive
    dependency):当一个依赖引入另一个依赖时,它们之间建立了一种“传递性依赖”的关系。比如,如果A依赖于B,而B依赖于C,则A会传递性地依赖于C。传递性依赖会在其直接依赖项之后被加载。

    冲突解决(Dependency conflict
    resolution):当多个依赖项引入不同版本的同一个库时,Maven需要解决依赖冲突。Maven解决冲突的方式是使用最短路径算法,在依赖树中找到最短的路径来解析依赖,从而确定使用哪个版本的库。

    综上所述,这些依赖项的加载顺序是:父级依赖 → 子模块依赖 → 直接依赖项 →
    传递性依赖。在加载依赖时,Maven还会进行依赖冲突解决,确保使用正确的库版本。

我们用到的也就是最短路径的话就时最高优先级。
举个例子。下面有两个连接池,druid和hikariCP。
项目引入多个连接池,导致使用其他连接池,maven分析学习_第1张图片
因为druid的路径比hikariCP短。
所以使用的是druid的连接池。

但是我想指定为hikariCP的连接池怎么办呢? 我需要在引入的这个项目里,加入exclude druid

            
                
                    
                        com.alibaba
                        druid-spring-boot-starter
                    
                
            

当然是最外层的配置,因为最外层配置优先级最高。

如果你是在内层有多个配置,那么在内层配置多个同样的exclude

不对还是有问题

具体

https://www.cnblogs.com/dxiaodang/p/14582672.html

依赖的三个原则
1路径最短,2声明顺序优先,3子集的优先级比父级的高

springboot-start默认使用的是hikari的连接池,但是在springboot自动装配连接池的时候,有一个条件
项目引入多个连接池,导致使用其他连接池,maven分析学习_第2张图片

也就是必须没有DataSource这个类型的bean
项目引入多个连接池,导致使用其他连接池,maven分析学习_第3张图片

datasource是一个接口,他的实现包含druid,所以导致hikari失效。
项目引入多个连接池,导致使用其他连接池,maven分析学习_第4张图片

导致nacos配置中的用户名与密码找不到

解决方式
在pom文件中对于druid的连接池进行去除druid的依赖

com.betterwood.systemconfig
system-config-api
${system.config.api.version}


com.alibaba
druid


你可能感兴趣的:(maven,学习,java)