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