最全!最強大!Maven知識大全

一、什麼是Maven

Maven是Apache的一款開源的專案管理工具,是Apache基於ANT進行升級後,研發出了全新的自動化構建工具。

Maven使用專案物件模型(POM-Project Object Model,專案物件模型)的概念,可以透過一小段描述資訊來管理專案的構建,報告和文件的專案管理工具軟體。在Maven中,每個專案都相當於是一個物件,物件(專案)和物件(專案)之間是有關係的,關係包含了:依賴、繼承、聚合,實現Maven專案可以更加方便的實現導jar包、拆分專案等效果,因此,大部分公司專案都採用 Maven 管理。

二、Maven下載

Maven的官網地址如下:

http://maven。apache。org/

具體的下載介面如下:

最全!最強大!Maven知識大全

2。1 設定 Maven 環境變數

新增環境變數 MAVEN_HOME

右鍵 “計算機”,選擇 “屬性”,之後點選 “高階系統設定”,點選“環境變數”,來設定環境變數,有以下系統變數需要配置:

新建系統變數

MAVEN_HOME

,變數值:

D:\apache-maven-3.8.6(這裡是下載的Maven的地址)

最全!最強大!Maven知識大全

編輯系統變數

Path

,新增變數值:

%MAVEN_HOME%\bin

最全!最強大!Maven知識大全

三、IDEA整合Maven

如下圖所示,可以用自己下載的Maven路徑替換系統自帶的版本。

最全!最強大!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/

最全!最強大!Maven知識大全

如果倉庫A可以提供倉庫B儲存的所有內容,那麼就可以認為A是B的一個映象。

在國內直接連線中央倉庫下載依賴,由於一些特殊原因下載速度非常慢。這時,我們可以使用阿里雲提供的映象倉庫來替換中央倉庫。修改 maven 根目錄下的 conf 資料夾中的 settings。xml 檔案,在 mirrors 節點上,新增內容如下:

6。3 倉庫優先順序

最全!最強大!Maven知識大全

七、JDK配置

當IDEA中有多個JDK時,需要在Maven中指定編譯和執行的JDK,在settings。xml中配置:

注:配置的前提是IDEA中要有1。8的JDK

<!—— settings。xml中的id不能隨便起的 ——> <!—— 告訴maven我們用jdk1。8 ——> jdk-1。8 <!—— 開啟JDK的使用 ——> true 1。8 <!—— 配置編譯器資訊 ——> 1。8 1。8 1。8

八、Maven工程型別

POM工程:

POM工程是邏輯工程。用在父級工程或聚合工程中。用來做jar包的版本控制。

JAR工程:

打包成jar,用作jar包使用。即常見的本地工程 ——-> Java Project。

WAR工程:

打包成war,釋出在伺服器上的工程。

九、IDEA建立Maven工程

最全!最強大!Maven知識大全

專案的標準目錄結構如下:

最全!最強大!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知識大全

十、Maven工程關係

10。1 依賴關係

A工程在開發或執行過程中需要B工程提供支援,則說明A工程依賴B工程。

在這種情況下,A專案的pom。xml檔案中需要配置定義依賴關係。

最全!最強大!Maven知識大全

10。1。1 如何注入依賴呢?

在pom。xml檔案中,根元素project下的 dependencies標籤中,配置依賴資訊。標籤中可以包含多個 dependence元素,以宣告多個依賴。

每個依賴dependence標籤都應該包含以下元素:groupId、artifactId, version ,這三個是依賴的基本座標, 對於任何一個依賴來說,基本座標是最重要的,Maven是根據座標尋找需要的依賴的。

最全!最強大!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會隱式的把這些庫間接依賴的庫也加入到我們的專案中。

這個特性是靠解析從遠端倉庫中獲取的依賴庫的專案檔案實現的。

一般的,這些專案的所有依賴都會加入到專案中,或者從父專案繼承,或者透過傳遞性依賴。

最全!最強大!Maven知識大全

如果B依賴了C,那麼A依賴B時會自動把B和C都匯入進來。

案例:

專案1:test專案依賴了Mybatis的內容,建立test專案後,選擇IDEA最右側Maven面板lifecycle,雙擊install後就會把專案安裝到本地倉庫中,其他專案就可以透過座標引用此專案。

注:請將專案test打包為jar包

最全!最強大!Maven知識大全

再建立專案test1:讓專案test1依賴專案test:

最全!最強大!Maven知識大全

從上面可以證明:

專案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

最全!最強大!Maven知識大全

10。1。6 依賴範圍

傳遞依賴發現可以透過使用如下的依賴範圍來得到限制。依賴範圍決定了依賴的座標在什麼情況下有效,什麼情況下無效。

範圍

描述

編譯階段(compile)

該範圍表明相關依賴是隻在專案的類路徑下有效,表明該依賴在編譯和執行時都生效。預設取值。

供應階段(provided)

該範圍表明相關依賴是由執行時的JDK或者網路伺服器提供的,

編譯和測試專案的時候需要該依賴,但在執行專案的時候,由於容器已經提供,就不需要Maven重複地引入。

執行階段(runtime)

該範圍表明相關依賴在編譯階段不是必須的,但是在執行階段是必須的。也就是,

編譯時不需要生效,而只在執行時生效。

測試階段(test)

該範圍表明相關依賴

只在編譯測試程式碼和執行測試的時候需要,應用的正常執行不需要此類依賴。

系統階段(system)

該範圍表明你需要提供一個系統路徑。與provided類似,不過必須顯式指定一個本地系統路徑的JAR,此類依賴應該一直有效,Maven也不會去倉庫中尋找它。但是,使用system範圍依賴時必須透過systemPath元素顯式地指定依賴檔案的路徑。

匯入階段(import)

該範圍只在依賴是一個 pom 裡定義的依賴時使用。同時,當前專案的POM 檔案的 部分定義的依賴關係可以取代某特定的 POM。import範圍只適用於pom檔案中的部分。表明指定的POM必須使用部分的依賴。

注意:import只能用在dependencyManagement的scope裡。

案例:

定義一個父POM工程

最全!最強大!Maven知識大全

定義一個子工程

最全!最強大!Maven知識大全

結論:

子工程不用指定依賴的版本號,這樣就可以在父工程進行統一管理。

如果父工程中加入score-import 相當於強制指定了版本號。

最全!最強大!Maven知識大全

10。2 繼承關係

如果A工程繼承B工程,則代表A工程預設依賴B工程依賴的所有資源,且可以應用B工程中定義的所有資源資訊。

被繼承的工程(B工程)只能是POM工程。

注:在父專案中放在中的內容是不被子專案繼承,不可以直接使用。

放在中的內容主要目的是進行版本管理。裡面的內容在子專案中依賴時座標只需要填寫groupId和artifactId即可。(注意:如果子專案不希望使用父專案的版本,可以明確配置version)。

父工程:

最全!最強大!Maven知識大全

子工程:

最全!最強大!Maven知識大全

整合關係本質上是POM檔案的繼承 。

10。3 聚合關係

如果工程有2個以上模組時,每個模組都是一個獨立的功能集合。比如某電商系統中擁有使用者中心、商品中心、購物車中心等。在開發的時候每個中心都可以獨立編譯、測試和執行。這個時候就需要聚合工程。

建立聚合工程時,總的工程必須是一個POM工程(Maven Project)(聚合專案必須是一個pom型別的專案,jar專案和war專案是沒有辦法做聚合工程的),各子模組可以是任意型別模組(Maven Module)。

聚合包含了繼承的特性。

聚合時多個專案的本質還是一個專案。這些專案被一個大的父專案包含。且這時父專案型別為pom型別。同時在父專案的pom。xml中出現表示包含的所有子模組。

父工程:

最全!最強大!Maven知識大全

子模組:

最全!最強大!Maven知識大全

十一、Maven 構建生命週期

Maven 構建生命週期定義了一個專案構建跟釋出的過程。

一個典型的 Maven 構建(build)生命週期是由以下幾個階段的序列組成的:

最全!最強大!Maven知識大全

階段

處理

描述

驗證 validate

驗證專案

驗證專案是否正確且所有必須資訊是可用的

編譯 compile

執行編譯

原始碼編譯在此階段完成

測試 Test

測試

使用適當的單元測試框架(例如JUnit)執行測試。

包裝 package

打包

建立JAR/WAR包如在 pom。xml 中定義提及的包

檢查 verify

檢查

對整合測試的結果進行檢查,以保證質量達標

安裝 install

安裝

安裝打包的專案到本地倉庫,以供其他專案使用

部署 deploy

部署

複製最終的工程包到遠端倉庫中,以共享給其他開發人員和工程

十二、Maven常見外掛

12。1 編輯器外掛

透過編譯器外掛,我們可以配置使用的JDK或者說編譯器的版本。

1.settings.xml檔案中配置全域性編譯器外掛。

透過找到profiles節點,在裡面加入profile節點。

<!—— 定義的編譯器外掛ID,全域性唯一,名字隨便起 ——> jdk-1。8 <!—— 外掛標記,activeByDefault :true預設編譯器,jdk提供編譯器版本 ——> true 1。8 <!—— 配置資訊source-源資訊,target-位元組碼資訊,compilerVersion-編譯過程版本 ——> 1。8 1。8 1。8

2.配置編譯器外掛:pom.xml配置片段。

<!—— 配置maven的編譯外掛 ——> <!——JDK編譯外掛 ——> <!——外掛座標 ——> org。apache。maven。plugins maven-compiler-plugin 3。2 <!—— ——> <!—— 原始碼使用JDK版本——> 1。7 <!—— 原始碼編譯為class檔案的版本,要保持跟上面版本一致——> 1。7 UTF-8

12。2 資源複製外掛

Maven在打包時預設只將src/main/resources裡的配置檔案複製到專案中並做打包處理,而非resource目錄下的配置檔案在打包時不會新增到專案中。

我們的配置檔案,一般都放在:src/main/resources

然後打包後配置檔案就會在target的classes下面放著:

如果想把非resources下面的檔案也打包到classes下面,需要在pom。xml配置如下內容:

最全!最強大!Maven知識大全

12。3 Tomcat外掛

我們如果建立war專案,必然要部署在伺服器上,有如下方式:

部署在遠端伺服器上。

將IDEA和外部Tomcat產生關聯,然後將專案部署在外部tomcat上。

其實還有別的方式,不用依賴外部的Tomcat,Maven提供了Tomcat外掛,我們可以配置來使用。

12。3。1 建立web專案(war專案)

最全!最強大!Maven知識大全

使用Tomcat外掛釋出部署並執行war工程的時候,需要使用啟動命令,啟動命令為: tomcat7:run。

命令中的tomcat7是外掛命名,由外掛提供商決定;run為外掛中的具體功能。

注意:

之前用的編譯器外掛和資源複製外掛,不是可執行的外掛,Maven直接幫我們運行了。但是Tomcat屬於可執行外掛,它什麼時候工作需要程式設計師透過命令來執行控制。

具體pom。xml檔案的配置如下:

<!—— 配置Tomcat外掛 ——> org。apache。tomcat。maven tomcat7-maven-plugin 2。2 <!—— 配置Tomcat監聽埠 ——> 8080 <!—— 配置專案的訪問路徑(Application Context) ——> /

最全!最強大!Maven知識大全

在瀏覽器中訪問index。jsp頁面:

最全!最強大!Maven知識大全