一、什麼是Maven
Maven是Apache的一款開源的專案管理工具,是Apache基於ANT進行升級後,研發出了全新的自動化構建工具。
Maven使用專案物件模型(POM-Project Object Model,專案物件模型)的概念,可以透過一小段描述資訊來管理專案的構建,報告和文件的專案管理工具軟體。在Maven中,每個專案都相當於是一個物件,物件(專案)和物件(專案)之間是有關係的,關係包含了:依賴、繼承、聚合,實現Maven專案可以更加方便的實現導jar包、拆分專案等效果,因此,大部分公司專案都採用 Maven 管理。
二、Maven下載
Maven的官網地址如下:
http://maven。apache。org/
具體的下載介面如下:
2。1 設定 Maven 環境變數
新增環境變數 MAVEN_HOME
右鍵 “計算機”,選擇 “屬性”,之後點選 “高階系統設定”,點選“環境變數”,來設定環境變數,有以下系統變數需要配置:
新建系統變數
MAVEN_HOME
,變數值:
D:\apache-maven-3.8.6(這裡是下載的Maven的地址)
編輯系統變數
Path
,新增變數值:
%MAVEN_HOME%\bin
三、IDEA整合Maven
如下圖所示,可以用自己下載的Maven路徑替換系統自帶的版本。
四、Maven目錄結構解析
Maven目錄結構如下圖所示:
bin:
存放的是執行檔案和命令,在IDEA中可以直接整合Maven
conf目錄:
存放的是配置資訊,其中有一個非常重要的配置檔案settings。xml,這是maven的核心配置檔案,是一個全域性配置檔案。
在電腦C盤的使用者主目錄下面有一個隱藏資料夾。m2資料夾,這是Maven預設的工作資料夾。如果沒有。m2目錄 ,可以透過手動執行mvn命令建立。
五、Maven常見命令
常見命令
描述
install
本地安裝, 包含編譯,打包,安裝到本地倉庫。
編譯 - javac。
打包 - jar, 將java程式碼打包為jar檔案。
安裝到本地倉庫 - 將打包的jar檔案,儲存到本地倉庫目錄中。
clean
清除已編譯資訊。
刪除工程中的target目錄。
compile
只編譯, javac命令
package
打包命令,包含編譯和打包兩個功能。
install和package的區別:
package命令完成了專案編譯、單元測試、打包功能,但沒有把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫和遠端maven私服倉庫。
install命令完成了專案編譯、單元測試、打包功能,同時把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫,但沒有佈署到遠端maven私服倉庫。
六、Maven倉庫
在 Maven 的術語中,倉庫是一個位置(place)。Maven 倉庫是專案中依賴的第三方庫,這個庫所在的位置叫做倉庫。在 Maven 中,任何一個依賴、外掛或者專案構建的輸出,都可以稱之為構件。
Maven 可以在某個位置統一儲存所有的 Maven 專案共享的構件,這個統一的位置就是倉庫,專案構建完畢後生成的構件也可以安裝或者部署到倉庫中,供其它專案使用。
Maven倉庫是基於簡單檔案系統儲存的,集中化管理Java API資源(構件)的一個服務。倉庫中的任何一個構件都有其唯一的座標,根據這個座標可以定義其在倉庫中的唯一儲存路徑。得益於 Maven 的座標機制,任何 Maven專案使用任何一個構件的方式都是完全相同的。
Maven 倉庫能幫助我們管理構件(主要是JAR),它就是放置所有JAR檔案(WAR,ZIP,POM等等)的地方。
對於Maven來說,倉庫分為兩類:本地倉庫和遠端倉庫。
6。1 本地倉庫
本地倉庫只是本機的一份複製,用來快取遠端下載的內容,包含我們尚未釋出的臨時構件。
執行 Maven 的時候,Maven 所需要的任何構件都是直接從本地倉庫獲取的。如果本地倉庫沒有,它會首先嚐試從遠端倉庫下載構件至本地倉庫,然後再使用本地倉庫的構件。
預設情況下,不管Linux還是 Windows,每個使用者在自己的使用者目錄下都有一個路徑名為 。m2/repository/ 的倉庫目錄。
Maven 本地倉庫預設被建立在 %USER_HOME% 目錄下。要修改預設位置,在 %M2_HOME%\conf 目錄中的 Maven 的 settings。xml 檔案中定義另一個路徑。
6。2 遠端倉庫
我們稱不在本機中的一切倉庫都是遠端倉庫。遠端倉庫又分為中央倉庫和本地私服倉庫。
遠端倉庫指透過各種協議如file://和http://訪問的其它型別的倉庫。這些倉庫可能是第三方搭建的真實的遠端倉庫,用來提供他們的構件下載(例如repo。maven。apache。org和uk。maven。org是Maven的中央倉庫)。其它“遠端”倉庫可能是我們的公司擁有的建立在檔案或HTTP伺服器上的內部倉庫(不是Apache的那個中央倉庫,而是我們公司的私服,我們在區域網搭建的maven倉庫),用來在開發團隊間共享私有構件和管理釋出的。
預設的遠端倉庫使用的Apache提供的中央倉庫:
Apache的mvn遠端倉庫:
https://mvnrepository。com/
如果倉庫A可以提供倉庫B儲存的所有內容,那麼就可以認為A是B的一個映象。
在國內直接連線中央倉庫下載依賴,由於一些特殊原因下載速度非常慢。這時,我們可以使用阿里雲提供的映象倉庫來替換中央倉庫。修改 maven 根目錄下的 conf 資料夾中的 settings。xml 檔案,在 mirrors 節點上,新增內容如下:
6。3 倉庫優先順序
七、JDK配置
當IDEA中有多個JDK時,需要在Maven中指定編譯和執行的JDK,在settings。xml中配置:
注:配置的前提是IDEA中要有1。8的JDK
八、Maven工程型別
POM工程:
POM工程是邏輯工程。用在父級工程或聚合工程中。用來做jar包的版本控制。
JAR工程:
打包成jar,用作jar包使用。即常見的本地工程 ——-> Java Project。
WAR工程:
打包成war,釋出在伺服器上的工程。
九、IDEA建立Maven工程
專案的標準目錄結構如下:
9。1 Maven專案目錄介紹
src:包含了專案所有的原始碼和資原始檔,以及其他專案相關的檔案。
src/main/java:這個目錄下儲存java原始碼。
src/main/resources:儲存主要的資原始檔。比如xml配置檔案和properties檔案。
src/test/java:儲存測試用的類,比如JUNIT的測試一般就放在這個目錄下面。因為測試類本身實際是不屬於專案的,所以放在任何一個包下都顯得很尷尬,所以maven專門建立了一個測試包,用於存放測試的類。
src/test/resources:可以自己建立,儲存測試環境用的資原始檔。
target:編譯後內容放置的資料夾 。
pom。xml:Maven的基礎配置檔案。配置專案和專案之間關係,包括配置依賴關係等等。
——test 專案名
——。idea 專案的配置,自動生成的,無需關注。
——src
—— main 實際開發內容
——java 寫包和java程式碼,此檔案預設只編譯。java檔案
——resource 所有配置檔案,最終編譯把配置檔案放入到classpath中。
—— test 測試時使用,自己寫測試類或junit工具等
——java 儲存測試用的類
pom。xml 整個maven專案所有配置內容。
十、Maven工程關係
10。1 依賴關係
A工程在開發或執行過程中需要B工程提供支援,則說明A工程依賴B工程。
在這種情況下,A專案的pom。xml檔案中需要配置定義依賴關係。
10。1。1 如何注入依賴呢?
在pom。xml檔案中,根元素project下的 dependencies標籤中,配置依賴資訊。標籤中可以包含多個 dependence元素,以宣告多個依賴。
每個依賴dependence標籤都應該包含以下元素:groupId、artifactId, version ,這三個是依賴的基本座標, 對於任何一個依賴來說,基本座標是最重要的,Maven是根據座標尋找需要的依賴的。
10。1。2 依賴的優點
節省了手動新增jar包的操作,省時省力!!!
解決jar包衝突問題。
10。1。3 依賴原則
1.第一原則:最短路徑優先原則
“最短路徑優先”意味著專案依賴關係樹中路徑最短的版本會被使用。
例如,假設A、B、C之間的依賴關係是A->B->C->D(1。0) 和A->F->D(2。0),那麼D(2。0)會被使用,因為A->F->D(2。0)的路徑更短。
2. 第二原則:最先宣告原則
依賴路徑長度一樣長的時候,第一原則就不適用了,比如這樣的依賴關係:A–>C–>Y(1。0),A–>D–>Y(2。0),Y(1。0)和Y(2。0)的依賴路徑長度是一樣長的,都為2。那麼到底誰會被解析使用呢?
在maven2。0。8及之前的版本中,這是不確定的,但是maven2。0。9開始,為了儘可能避免構建的不確定性,maven定義了依賴調解的第二原則:最先宣告優先。
在依賴路徑長度相等的前提下,在POM中依賴宣告的順序決定了誰會被解析使用。順序最靠前的那個依賴優先使用。
10。1。4 依賴的傳遞性
依賴傳遞性是Maven2。0的新特性。
假設專案依賴於一個庫,而這個庫又依賴於其他庫。我們不必自己去找出所有這些依賴,我們只需要加上直接依賴的庫,Maven會隱式的把這些庫間接依賴的庫也加入到我們的專案中。
這個特性是靠解析從遠端倉庫中獲取的依賴庫的專案檔案實現的。
一般的,這些專案的所有依賴都會加入到專案中,或者從父專案繼承,或者透過傳遞性依賴。
如果B依賴了C,那麼A依賴B時會自動把B和C都匯入進來。
案例:
專案1:test專案依賴了Mybatis的內容,建立test專案後,選擇IDEA最右側Maven面板lifecycle,雙擊install後就會把專案安裝到本地倉庫中,其他專案就可以透過座標引用此專案。
注:請將專案test打包為jar包
再建立專案test1:讓專案test1依賴專案test:
從上面可以證明:
專案test1依賴專案test,專案test依賴Mybatis工程,根據依賴的傳遞性,專案test1可以直接使用Mybatis工程。
10。1。5 排除依賴
在有些場景中,需要將傳遞的某部分依賴排除,可以透過exclusions標籤實現。
exclusions:
用來排除傳遞性依賴。在exclusions標籤中可配置多個exclusion標籤,每個exclusion標籤需要配置groupId, artifactId, version三項基本元素(注意:不用寫版本號)。
比如:A——->B——->C (Mybatis。jar) 排除C中的Mybatis。jar
10。1。6 依賴範圍
傳遞依賴發現可以透過使用如下的依賴範圍來得到限制。依賴範圍決定了依賴的座標在什麼情況下有效,什麼情況下無效。
範圍
描述
編譯階段(compile)
該範圍表明相關依賴是隻在專案的類路徑下有效,表明該依賴在編譯和執行時都生效。預設取值。
供應階段(provided)
該範圍表明相關依賴是由執行時的JDK或者網路伺服器提供的,
編譯和測試專案的時候需要該依賴,但在執行專案的時候,由於容器已經提供,就不需要Maven重複地引入。
執行階段(runtime)
該範圍表明相關依賴在編譯階段不是必須的,但是在執行階段是必須的。也就是,
編譯時不需要生效,而只在執行時生效。
測試階段(test)
該範圍表明相關依賴
只在編譯測試程式碼和執行測試的時候需要,應用的正常執行不需要此類依賴。
系統階段(system)
該範圍表明你需要提供一個系統路徑。與provided類似,不過必須顯式指定一個本地系統路徑的JAR,此類依賴應該一直有效,Maven也不會去倉庫中尋找它。但是,使用system範圍依賴時必須透過systemPath元素顯式地指定依賴檔案的路徑。
匯入階段(import)
該範圍只在依賴是一個 pom 裡定義的依賴時使用。同時,當前專案的POM 檔案的 部分定義的依賴關係可以取代某特定的 POM。import範圍只適用於pom檔案中的
注意:import只能用在dependencyManagement的scope裡。
案例:
定義一個父POM工程
定義一個子工程
結論:
子工程不用指定依賴的版本號,這樣就可以在父工程進行統一管理。
如果父工程中加入score-import 相當於強制指定了版本號。
10。2 繼承關係
如果A工程繼承B工程,則代表A工程預設依賴B工程依賴的所有資源,且可以應用B工程中定義的所有資源資訊。
被繼承的工程(B工程)只能是POM工程。
注:在父專案中放在
放在
父工程:
子工程:
整合關係本質上是POM檔案的繼承 。
10。3 聚合關係
如果工程有2個以上模組時,每個模組都是一個獨立的功能集合。比如某電商系統中擁有使用者中心、商品中心、購物車中心等。在開發的時候每個中心都可以獨立編譯、測試和執行。這個時候就需要聚合工程。
建立聚合工程時,總的工程必須是一個POM工程(Maven Project)(聚合專案必須是一個pom型別的專案,jar專案和war專案是沒有辦法做聚合工程的),各子模組可以是任意型別模組(Maven Module)。
聚合包含了繼承的特性。
聚合時多個專案的本質還是一個專案。這些專案被一個大的父專案包含。且這時父專案型別為pom型別。同時在父專案的pom。xml中出現
父工程:
子模組:
十一、Maven 構建生命週期
Maven 構建生命週期定義了一個專案構建跟釋出的過程。
一個典型的 Maven 構建(build)生命週期是由以下幾個階段的序列組成的:
階段
處理
描述
驗證 validate
驗證專案
驗證專案是否正確且所有必須資訊是可用的
編譯 compile
執行編譯
原始碼編譯在此階段完成
測試 Test
測試
使用適當的單元測試框架(例如JUnit)執行測試。
包裝 package
打包
建立JAR/WAR包如在 pom。xml 中定義提及的包
檢查 verify
檢查
對整合測試的結果進行檢查,以保證質量達標
安裝 install
安裝
安裝打包的專案到本地倉庫,以供其他專案使用
部署 deploy
部署
複製最終的工程包到遠端倉庫中,以共享給其他開發人員和工程
十二、Maven常見外掛
12。1 編輯器外掛
透過編譯器外掛,我們可以配置使用的JDK或者說編譯器的版本。
1.settings.xml檔案中配置全域性編譯器外掛。
透過找到profiles節點,在裡面加入profile節點。
2.配置編譯器外掛:pom.xml配置片段。
<!—— 配置maven的編譯外掛 ——>
12。2 資源複製外掛
Maven在打包時預設只將src/main/resources裡的配置檔案複製到專案中並做打包處理,而非resource目錄下的配置檔案在打包時不會新增到專案中。
我們的配置檔案,一般都放在:src/main/resources
然後打包後配置檔案就會在target的classes下面放著:
如果想把非resources下面的檔案也打包到classes下面,需要在pom。xml配置如下內容:
12。3 Tomcat外掛
我們如果建立war專案,必然要部署在伺服器上,有如下方式:
部署在遠端伺服器上。
將IDEA和外部Tomcat產生關聯,然後將專案部署在外部tomcat上。
其實還有別的方式,不用依賴外部的Tomcat,Maven提供了Tomcat外掛,我們可以配置來使用。
12。3。1 建立web專案(war專案)
使用Tomcat外掛釋出部署並執行war工程的時候,需要使用啟動命令,啟動命令為: tomcat7:run。
命令中的tomcat7是外掛命名,由外掛提供商決定;run為外掛中的具體功能。
注意:
之前用的編譯器外掛和資源複製外掛,不是可執行的外掛,Maven直接幫我們運行了。但是Tomcat屬於可執行外掛,它什麼時候工作需要程式設計師透過命令來執行控制。
具體pom。xml檔案的配置如下:
在瀏覽器中訪問index。jsp頁面: