情景再现:

 项目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>