目錄
一.Maven介紹與功能
二.依賴管理
1.依賴的配置
2.依賴的傳遞性
3.排除依賴
4.依賴的作用范圍
5.依賴的生命周期
一.Maven介紹與功能
maven是一個項目管理和構建工具,是基于對象模型POM實現。
Maven的作用:
-
便捷的依賴管理:使用Maven可以簡化依賴管理過程。通過在項目的pom.xml文件中聲明依賴關系,Maven可以自動下載所需的依賴庫,并將它們添加到項目的類路徑中。這消除了手動下載和配置jar包的繁瑣過程,使依賴管理更加方便和可靠。
-
統一的項目結構:Maven定義了標準的項目結構,規定了源代碼、資源文件、測試代碼等目錄的布局方式。這使得不同IDE(如Eclipse、IntelliJ IDEA)之間可以共享和識別相同的項目結構,簡化了項目之間的遷移和協作。
-
標準的項目構建流程:Maven提供了一套標準化的項目構建流程。通過執行Maven命令,可以進行項目的編譯、測試、打包、部署等一系列操作。這種標準化的構建流程確保了項目的一致性和可重復性,提高了開發效率。
二.依賴管理
1.依賴的配置
所謂的依賴指的就是當前項目所需要的jar包,一個項目可以引入多個jar包
案例:導入多個包 mysql、ch.qos.logback兩個包
首先打開maven項目工程找到pom.xml
設置依賴標簽
<!-- 設置標簽依賴--><dependencies>
<!-- 設置具體依賴--><dependency>
<!-- 配置代表項目或組織的唯一標識符--><groupId>ch.qos.logback</groupId>
<!-- 配置代表特定項目的唯一標識符--><artifactId>logback-classic</artifactId>
<!-- 配置版本號--><version>1.2.3</version></dependency><!-- 操作類似--><dependency><groupId>mysql-java</groupId><artifactId>mysql-java</artifactId><version>5.1.21</version></dependency></dependencies>
如果以前沒有使用過相關jar包,則會冒紅報錯,因為在本地倉庫沒有找到相關的jar包
2.依賴的傳遞性
如果一個項目projectA依賴了一個A-jar包,而一個A-jar包中又依賴了其他的jar包,那么projectA對應的也就依賴了A-jar包對應的其他jar包
依賴傳遞有兩種:一種是直接依賴,一種是間接依賴
?通過圖標形勢查看依賴關系
在pom中右鍵找到圖再點擊顯示依賴項
這樣就可以清晰看到項目之間的依賴
當然依賴可能會產生一個特殊情況,A->B->A 循環依賴,項目A依賴了項目B,而項目B依賴了項目A。這種情況也是面試題常問的一個問題
?面試題:Maven中如何解決依賴循環的問題
重構代碼結構:首先,我們可以檢查項目結構并嘗試重構代碼以消除依賴循環。這可能需要重新設計模塊之間的關系,將公共功能提取到獨立的模塊中,或者修改模塊的依賴關系,以確保它們形成一個有向無環圖(DAG)。
使用接口或抽象類:如果依賴循環是由于具體類之間的相互依賴引起的,我們可以考慮使用接口或抽象類來解耦它們。這樣,依賴關系將變得單向,并且可以更容易地管理。
使用Maven插件:Maven提供了一些插件來幫助解決依賴循環問題。例如,可以使用Maven的
maven-dependency-plugin
來分析項目依賴關系,并找出導致循環的依賴。然后,我們可以使用exclude
或optional
標記,將其中一個模塊的依賴排除或設置為可選,以打破循環。模塊拆分:另一種方法是將存在依賴循環的模塊拆分為更小的、相互獨立的模塊。這樣,我們可以將它們放在不同的項目中,并使用Maven的多模塊項目進行管理。通過將功能劃分到不同的模塊中,可以更好地管理和控制它們之間的依賴關系。
3.排除依賴
由上面的內容可以知道依賴具有傳遞性,PorjectA項目會依賴A-jar包下的所有依賴jar包。但是如果明確知道工程ProjectA中只需要A-jar包,不需要A-jar包下的某一個包,則可以通過<exclustions>標簽和<exclustion>實現排除依賴
<exclusions><exclusion><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></exclusion></exclusions>
?可以看到用了排除依賴后相關jar包就不存在了
4.依賴的作用范圍
依賴的jar包,在默認情況下,可以在任何地方使用,或者也可以通過<scope></ scope>標簽來設置相應jar包的作用范圍
作用范圍:
- 主程序范圍有效(main文件夾內)
- 測試程序范圍有效(test文件夾范圍內)
- 是否參與打包運行(package指令范圍內)
?scope標簽值與對應的作用范圍
案例:
設置logback的jar包的范圍為test,實現只能在test測試程序中運行
?注意不要忘了點擊更新
?接下來測試是否更改了作用范圍:
1.在test中使用logback的jar包對象,可以看到有提示相應的jar包
2.在main中使用則會發現并沒有相應的jar包
5.依賴的生命周期
在Maven中有三套相互獨立的生命周期
- clean 負責清理上一次編譯產生的字節碼文件
- default 核心工作 負責編譯、測試、打包、安裝、部署等等
- site 生成報告、發布站點等
每一套生命周期都有許多的生命周期階段,但是我們需要用到的生命周期并不需要太多,只需要掌握以下幾個核心生命周期的階段即可
?核心的生命周期階段
- clean :移除上一次構建生成的文件
- compile: 編譯項目的源代碼
- test:使用合適的單元測試框架運行測試
- package:將編譯后的文件進行打包
- install:安裝項目到本地倉庫
注意:同一套的生命周期的運行是由循序的,后面的生命周期的運行是需要依賴前面的生命周期的運行。所以如果使用后面的生命周期階段,就會自動執行前面的生命周期
比如運行test,會自動運行validate與compile,但是不會運行clean,因為clean與這些不是同一套的生命周期
運行指定的生命周期
有兩種方式運行指定的生命周期
第一種,找到右側欄中的maven打開項目下的生命周期,找到對應周期雙擊運行即可
第二種,在idea或者cmd中輸入指令 mvn xxx即可執行對應的生命周期階段
周期跳過
在工程文件中找到生命周期,找到小閃電圖標,點擊即可跳過對應的生命周期。