第一步在命令行中执行
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。
因为druid的路径比hikariCP短。
所以使用的是druid的连接池。
但是我想指定为hikariCP的连接池怎么办呢? 我需要在引入的这个项目里,加入exclude druid
<dependency>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
当然是最外层的配置,因为最外层配置优先级最高。
如果你是在内层有多个配置,那么在内层配置多个同样的exclude