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

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章