007_Maven依赖管理
1. Maven一個(gè)核心的特性就是依賴管理。當(dāng)我們處理多模塊的項(xiàng)目(包含成百上千個(gè)模塊或者子項(xiàng)目), 模塊間的依賴關(guān)系就變得非常復(fù)雜, 管理也變得很困難。針對(duì)此種情形, Maven提供了一種高度控制的方法。
2. 可傳遞性依賴
2.1. 一種相當(dāng)常見的情況, 比如說: A依賴于其他庫B; 另外一個(gè)項(xiàng)目C想要使用A, 那么C項(xiàng)目也可以使用庫B。
2.2. Maven可以避免去搜索所有所需庫的需求。Maven通過讀取項(xiàng)目文件(pom.xml), 找出它們項(xiàng)目之間的依賴關(guān)系。
2.3. 我們需要做的只是在每個(gè)項(xiàng)目的pom中定義好直接的依賴關(guān)系。其他的事情Maven會(huì)幫我們搞定。
2.4. 通過可傳遞性的依賴, 所有被包含的庫的圖形會(huì)快速的增長。當(dāng)有重復(fù)庫時(shí), 可能出現(xiàn)的情形將會(huì)持續(xù)上升。Maven提供一些功能來控制可傳遞的依賴的程度。
3. 依賴調(diào)節(jié)
3.1. 決定當(dāng)多個(gè)手動(dòng)創(chuàng)建的版本同時(shí)出現(xiàn)時(shí), 哪個(gè)依賴版本將會(huì)被使用。
3.2. 我們先導(dǎo)入spring-context-4.2.4.RELEASE.jar這個(gè)jar包, 然后再導(dǎo)入spring-webmvc-4.2.5.RELEASE.jar這個(gè)jar包, 這兩個(gè)jar包之間存在多個(gè)相同jar包的相互依賴關(guān)系, 實(shí)際生效的spring-webmvc和spring-web是4.2.5的, spring-aop、spring-beans、spring-context、spring-core和spring-expression是4.2.4的。
3.3. 那么我們先導(dǎo)入spring-webmvc-4.2.5.RELEASE.jar這個(gè)jar包, 然后再導(dǎo)入spring-context-4.2.4.RELEASE.jar這個(gè)jar包, spring-beans、spring-core和spring-expression變成了是4.2.5的。我們注意看spring-beans、spring-core和spring-expression這三個(gè)包在spring-webmvc-4.2.5.RELEASE.jar和spring-context-4.2.4.RELEASE.jar中的最高層次都是2。如果兩個(gè)依賴版本在依賴樹里的深度是一樣的時(shí)候, 第一個(gè)被聲明的依賴將會(huì)被使用。?
3.4. 首先導(dǎo)入spring-webmvc-4.2.5.RELEASE.jar這個(gè)jar包, 然后再導(dǎo)入spring-context-4.2.4.RELEASE.jar這個(gè)jar包, 最終生效的spring-context是4.2.4的。spring-context在spring-webmvc-4.2.5.RELEASE.jar中的最高層次是2, 在spring-context-4.2.4.RELEASE.jar中的最高層次是1。依賴層次優(yōu)先原則, 使用層次最高的。?
4. 依賴排除
4.1. 任何可傳遞的依賴都可以通過 "exclusion" 元素被排除在外。
4.2. 我們想使用Slf4j和logback日志的日志模式, 就不需要commons-logging日志包, 可以剔除它。
4.3. 右鍵commons-logging-1.2.jar——>Exclude Maven Artifact...
4.4. 點(diǎn)擊Ok按鈕?
4.5. 在pom.xml的spring-context-4.2.4.RELEASE.jar的依賴坐標(biāo)中多出了exclusions節(jié)點(diǎn), 該節(jié)點(diǎn)剔除了commons-logging包。我們添加上Slf4j和logback相關(guān)日志包。?
4.6. 實(shí)際生效的沒有commons-logging-1.2.jar包了。?
5. 依賴可選
5.1. 任何可傳遞的依賴可以被標(biāo)記為可選的, 通過使用"optional"元素。例如: Shop_Web依賴Shop_Service, Shop_Service依賴Shop_Dao。因此, Shop_Service可以標(biāo)記Shop_Dao為可選的, 這樣Shop_Web就可以不再使用Shop_Dao。
5.2. Shop_Service依賴Shop_Dao。
?5.3. Shop_Web依賴Shop_Service。
?5.4. Shop_Web同時(shí)依賴了Shop_Dao和Shop_Service。
5.5. 在Shop_Service中, 依賴Shop_Dao時(shí), 標(biāo)記為可選的。?
5.6. 這樣Shop_Web就可以不再使用Shop_Dao?
6. 定義版本常量
6.1. 可以使用properties標(biāo)簽定義版本遍歷, 一次定義多次使用, 版本變遷的時(shí)候只用修改版本變量, 達(dá)到對(duì)版本的管理。
7. 版本鎖定
7.1. 可以定義dependencyManagement標(biāo)簽對(duì)jar的版本進(jìn)行鎖定, 這樣子工程再添加相同的jar的依賴的時(shí)候只能使用此版本。
?8. 依賴范圍
8.1. 傳遞依賴發(fā)現(xiàn)可以通過使用如下的依賴范圍來得到限制:
8.2. Tomcat(網(wǎng)絡(luò)服務(wù)器)也包含有jsp-api-2.0.jar, 項(xiàng)目運(yùn)行后, 第一次編譯時(shí)使用Tomcat中的jar。編寫項(xiàng)目的時(shí)候, Eclipse找不到相關(guān)類( Eclipse自動(dòng)編譯), 所以要添加此依賴, 但是作用域只能是provided, 如果是compile和runtime項(xiàng)目運(yùn)行后會(huì)和Tomcat中的jar沖突。?
8.3. 運(yùn)行時(shí)是在編譯的時(shí)候不需要相關(guān)類, 但是運(yùn)行的時(shí)候需要相關(guān)類, 經(jīng)典的例子是Mysql驅(qū)動(dòng)包, 編寫代碼的時(shí)候使用Java的標(biāo)準(zhǔn)類即可, 連接Mysql數(shù)據(jù)庫的時(shí)候必須使用驅(qū)動(dòng)包。?
?8.4. 測(cè)試作用域一般是我們的junit。
8.5. 系統(tǒng)階段, 添加外部依賴使用。?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的007_Maven依赖管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 004_Maven构建生命周期
- 下一篇: 008_Maven Eclipse