1. 程式人生 > >maven傳遞依賴衝突解決

maven傳遞依賴衝突解決

傳遞依賴: A.jar 依賴 B.jar, B.jar 依賴 C.jar, 這個時候我們就說B是A的直接依賴, C是A傳遞依賴;

傳遞依賴可能會產生衝突: 聯絡著上面, 新匯入一個jar包D.jar, D依賴C.jar, 但是B依賴的1.1版本, 而D依賴的是1.2版本, 這時候C這個jar包的兩個版本, 如果同時被Maven匯入工程, 衝突就出現了!

針對這種衝突

一: Maven有自己的處理原則:

pom.xml

1. 宣告者優先原則那個先宣告, 就用那個的傳遞依賴

                <dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-spring-plugin</artifactId>
			<version>2.3.34</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.16.RELEASE</version>
		</dependency>

2. 路徑/座標優先原則直接依賴的優先級別要高於傳遞依賴

二.  pom.xml 程式碼來處理:

1. 排除依賴

   

注意: 不需要的排除掉, 不是排除掉所用的包!

2. 版本鎖定(推薦使用)

	<!-- 版本鎖定: dependencyManagement 它不會把jar包匯入,只是鎖定版本, 在 pom.xml 中jar包的版本號還可以鎖定,繼承該工程的子過程裡對應的jar包的版本號 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-beans</artifactId>
				<version>4.3.16.RELEASE</version>	<!-- 鎖定spring-beans版本號,傳遞依賴會自定導包 -->
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
			        <artifactId>spring-context</artifactId>
			        <version>4.3.16.RELEASE</version>   <!-- 鎖定struts2-spring-plugin版本號 -->
			</dependency>

		</dependencies>
	</dependencyManagement>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
		</dependency>
	        <!-- 有版本鎖定 就不需要自定版本號啦   -->
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-spring-plugin</artifactId>
                        <version>2.3.34</version>
		</dependency>

        </dependencies>

scope的依賴傳遞

A依賴B,B依賴C。當前專案為A,只當B在A專案中的scope,那麼c在A中的scope是如何得知呢?

當C是test或者provided時,C直接被丟棄,A不依賴C;(排除傳遞依賴)

否則A依賴C,C的scope繼承與B的scope