1.maven依賴的幾個特性
1.1 依賴範圍 -scope標籤spring
maven在構建過程有3套classpath,咱們會根據配置依賴的範圍 依賴不一樣的classpath,以下圖:api
compile: 默認是compile,對 編譯 測試 運行 都有效jsp
provided: 對編譯和測試classpath有效,運行的時候不須要加入,例如 jsp 依賴 searvlet api ,好比咱們在編譯和測試的時候有效可是在運行的時候 容器已經提供servletapi,若是加入會形成衝突maven
runtime: 只在測試和運行時 有效,比較典型的例子 jdbc api,只有在啓動代碼測試或者運行的時候纔會啓用ide
test: 只會在測試時有效,比較典型例子 就是junit ,只有再測試的時候 纔會啓用測試
1.2 依賴傳遞spa
好比咱們引入某一個依賴spring-test,依賴傳遞特性會很方便幫助咱們下來它相關的依賴,而沒必要有時會由於引入jar有問題而煩惱,可是也有弊端,存在一些沒必要要的依賴,可能會形成衝突。.net
1.3 依賴排除 -exclusion標籤插件
依賴排除的特性 也是爲了解決依賴衝突的一個方法,很方便去除依賴傳遞過程當中沒必要要的依賴。在下面依賴沖沖突會用到 該標籤。3d
1.4 依賴衝突產生緣由
使用maven久了會發現存在依賴衝突的問題,因爲依賴的傳遞特性會引入不少隱式的依賴和現有顯示jar版本 所衝突,從而形成版本衝突的問題。要解決這個問題,首先就是要查看pom.xml顯式和隱式的依賴類包, 而後經過這個類包樹找出咱們不想要的依賴類包,手工將其排除在外就能夠了。
2.依賴衝突的解決
2.1兩個基本原則:
1).短路優先原則
A->B->logback-1.0.jar
A->logback-1.1.jar
2).先聲明先優先原則(先解析先引用)
與項目A pom中配置 引用座標的順序有關,若是依賴B在C前的話 就優先B,反之...
A->B->logback-1.0.jar
A->C->logback-1.1.jar
2.2 演示兩個原則
1).建立三個maven工程
maven-01,maven-02,maven-03
2).三個工程依賴結構:
maven-01依賴 spring-test,maven-02,maven-03 (maven-02/03須要首先提交本地倉庫,maven-01才能找到 ,能夠參考尋找構件過程:1.3 倉庫尋找構件過程) ;
maven-02依賴commons-logging-1.1.1;
maven-03工程依賴 commons-logging-1.1.3
3).看下myEclipse或者執行mvn dependency:tree 查看依賴樹:
myeclispe:依賴樹
4).衝突解決辦法:
4.1 pom配置1:
Xml代碼
1. <dependency> 2. <groupid>org.springframework</groupid> 3. <artifactid>spring-test</artifactid> 4. <version>4.2.2.RELEASE</version> 5. <!-- 依賴排除 能夠排除對commons-logging 的依賴 6. <exclusions> 7. <exclusion> 8. <groupId>commons-logging</groupId> 9. <artifactId>commons-logging</artifactId> 10. </exclusion> 11. </exclusions> 12. --> 13. </dependency> 15. <!-- 添加對maven-02依賴 --> 16. <dependency> 17. <groupid>com.sohu.train</groupid> 18. <artifactid>maven-02</artifactid> 19. <version>1.0-SNAPSHORT</version> 20. </dependency>
短路優先原則:
maven-01->spring-test->spring-core->commons-loggings-1.2(依賴深度3)
maven-01->maven-02->commons-loggings-1.1.1(依賴深度2)
因此maven01工程依賴的commons-loggings-1.1.1
4.2 pom配置2:
Xml代碼
1. <dependency> 2. <groupid>org.springframework</groupid> 3. <artifactid>spring-test</artifactid> 4. <version>4.2.2.RELEASE</version> 5. <!-- 依賴排除 --> 6. <exclusions> 7. <exclusion> 8. <groupid>commons-logging</groupid> 9. <artifactid>commons-logging</artifactid> 10. </exclusion> 11. </exclusions> 12. </dependency> 14. <!-- 添加對maven-03依賴 --> 15. <dependency> 16. <groupid>com.sohu.train</groupid> 17. <artifactid>maven-03</artifactid> 18. <version>0.0.1-SNAPSHOT</version> 19. </dependency> 21. <!-- 添加對maven-02依賴 --> 22. <dependency> 23. <groupid>com.sohu.train</groupid> 24. <artifactid>maven-02</artifactid> 25. <version>1.0-SNAPSHORT</version> 26. </dependency>
先引用先優先的原則:
maven-01->spring-test->spring-core
maven-01->maven-02->commons-logging-1.1.1
maven-01->maven-03->commons-logging-1.1.3
若是pom先依賴maven-02則 依賴commons-logging-1.1.1 依賴;反之,若是pom先依賴maven-03則 依賴commons-logging-1.1.3 依賴
maven系列文章: