導入struts包,在struts核心包的ognl包下存在javassist包:
然后再導入hibernate包,在hibernate核心下也存在javassist包:
這樣便會存在沖突,ecplise沒有辦法區分去調用哪個版本的包,所以我們應該去解決包之間的沖突。
解決方案:
1.通過<excludions>標簽解決
我們如果想要使用較高版本的包,我們可以在低版本的包上右擊,然后選擇Exclude Maven Artifact。我們可以在pom.xml中看到:
這樣便對低版本的jar包進行了限制。
2.鎖定版本
面對眾多的依賴,有一種方法不用考慮依賴路徑、聲明優化等因素可以采用直接鎖定版本的方法確定依賴構件的版本,版本鎖定后則不考慮依賴的聲明順序或依賴的路徑,以鎖定的版本的為准添加到工程中,此方法在企業開發中常用。
如下的配置是鎖定了spring-beans和spring-context的版本:
<dependencyManagement> <dependencies> <!--這里鎖定版本為4.2.4 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> </dependencies> </dependencyManagement>
注意:在工程中鎖定依賴的版本並不代表在工程中添加了依賴,如果工程需要添加鎖定版本的依賴則需要單獨添加<dependencies></dependencies>標簽,如下:
<dependencies> <!--這里是添加依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> </dependencies>
上邊添加的依賴並沒有指定版本,原因是已在<dependencyManagement>中鎖定了版本,所以在<dependency>下不需要再指定版本。
依賴調解原則
1.第一聲明者優先原則
在pom文件定義依賴,先聲明的依賴為准。
Struts-spring-plugins包下有一個:Spring-bean-4.2.4
spring-context包下有一個:Spring-bean-4.2.5
測試:
如果將上邊struts-spring-plugins和spring-context順序顛倒,系統將導入spring-beans-4.2.4。
分析:
由於spring-context在前邊以spring-context依賴的spring-beans-4.2.4為准,所以最終spring-beans-4.2.4添加到了工程中。
2、路徑近者優先原則
例如:A依賴 spirng-beans-4.2.4,A依賴B依賴 spirng-beans-3.0.5,則spring-beans-4.2.4優先被依賴在A中,因為spring-beans-4.2.4相對spirng-beans-3.0.5被A依賴的路徑最近。
測試:
在本工程中的pom中加入spirng-beans-4.2.4的依賴,根據路徑近者優先原則,系統將導入spirng-beans-4.2.4:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.4.RELEASE</version> </dependency>
排除依賴
上邊的問題也可以通過排除依賴方法輔助依賴調解,如下:
比如在依賴struts2-spring-plugin的設置中添加排除依賴,排除spring-beans,
下邊的配置表示:依賴struts2-spring-plugin,但排除struts2-spring-plugin所依賴的spring-beans。
<!-- struts2-spring-plugin依賴spirng-beans-3.0.5 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24</version> <!-- 排除 spring-beans--> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> </exclusions> </dependency>