情景再现:
项目A依赖于项目B,项目B依赖于项目C(v1), 项目A依赖于项目D,项目D依赖于项目E,项目E依赖于C(v2),
1、A--->B---->C(v1) ,
2、A------>D---->E----->C(v2)
项目A隐形依赖了两个版本的C,那到底采用哪个版本呢?
分析:
依赖调解第一原则:路径优先,很明显,第一种路径深度是3,第二种路径深度是4,所以,maven会采用C(v1)
依赖调解第二原则:声明优先,假设路径深度相等,那么声明在前的会被引用。
让我们继续思考,假设C(v1)、C(v2)版本,项目都不用,而是用C(v3),那么我们就用到了排除,
如下httpcomponent、poi各自排除codec,然后声明项目中需要的codec版本,exclusion只需要声明groupid、artifactid,不需要声明version,因为根据“依赖调解”的原则,一个项目中不可能出现groupid、artifactid相等而version相等的多个依赖。
exclusion,只会排除所在依赖项目中的依赖;就是说,我在httpcomponent声明了排除codec,并不会排除掉poi引用codec,要想poi中也排除,那么在poi中也声明排除
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4.1</version>
<exclusions>
<exclusion>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
<exclusions>
<exclusion>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
本文转自:https://blog.csdn.net/wangjun5159/article/details/49095547