一、什麼是Maven
Maven是基於專案物件模型(POM project object model),可以通過一小段描述資訊(設定)來管理專案的構建,報告和文件的軟體專案管理工具。
二、爲什麼使用Maven
Maven的功能:
簡化、標準化專案建設過程
無縫連線處理,編譯,分配
增加可重用性並負責建立相關任務
Maven的核心功能是合理敘述專案間的依賴關係,通俗點講,就是通過pom.xml檔案的設定獲取jar包。
三、Maven目錄結構
1、Maven專案目錄結構
src 專案原始碼
-main 專案主體根目錄
----bin 指令碼庫
––java java原始碼檔案
––resources 資源庫,會自動複製到classes目錄裡
––filters 資源過濾檔案
––assembly 元件的描述設定(如何打包)
––config 組態檔
––webapp web應用的目錄。WEB-INF、css、js等
-test 專案測試根目錄
––java 單元測試java原始碼檔案
––resources 測試需要用的資源庫
––filters 測試資源過濾庫
-site Site(一些文件)
target 輸出根目錄
––classes 專案主體輸出目錄
––test-classes 專案測試輸出目錄
––site 專案site輸出目錄
2、Maven目錄結構
(1)bin: maven執行指令碼,命令。
(2)boot:包含 plexus-classworlds-2.23jar( plexus- classworlds是—個類載入器框
架,相對於java預設類載入器,他提供了更豐富的語法以方便設定, maven使用該框架載入
自己的類庫)。
(3)conf:組態檔 setting.xml,修改該檔案就可以在機器上全域性的制定 maven的行爲
但一般情況下,更傾向於複製該檔案到~(使用者目錄)/m2/目錄下,然後修改該檔案,在用
戶範圍內制定 maven的行爲。
(4)lib:包含 maven執行時所需要的ava類庫,包括第三方的依賴類庫。
(5)LICENSE. txt:記錄了 maven使用該軟體的許可證。
(6) NOTICE. txt:記錄了 maven包含的第三方軟體
(7) README. txt:記錄了 maven的簡要介紹
3、maven常用命令
(1) mvn help: system:該命令列印出所有的ava系統屬性和環境變數
(2) clean:清理輸出目錄預設 target,。
(3) mvn clean compline:編譯專案主程式碼,預設編譯至 target/ classes目錄下。
(4) mvn clean test: maven測試,但實際執行的命令有: clean:clean,resource resources, compiler: compile, resources testResources,compiler testcompile, maven在執行test之前,會先自動執行專案主資源處理,主程式碼編譯,測試資源處理,測試程式碼編譯等工作,測試程式碼編譯通過之後預設在 target/ test-classes目錄下生成二進制檔案,緊接着 surefire:test任務執行測試,並輸出測試報告,顯示一共執行
了多少次測試,失敗成功等
(5) mvn celan package: maven打包, maven會在打包之前預設執行編譯,測試等操作,打包成功之後預設輸出在 target/目錄中
(6) mvn clean instal:! maven安裝,讓其他的專案直接參照這個專案。
(7) echo% MAVEN HOME%:檢視 maven安裝路徑
(8) mvn:檢查是否安裝了 maven
(9) mvn dependency;ist:檢視當前專案中的已解析依賴
(10) mvn dependency tree:檢視當前專案的依賴樹
(11) mvn dependency: analyse:檢視當前專案中使用未宣告的依賴和已宣告但未使用的
四、Maven生命週期
1、Maven生命週期lifecycle由各個階段組成,每個階段由maven外掛的plugin來執行完成,掛接一個goal,goal是任務的最小單元。
2、預設構建的生命週期:校驗validate——初始化initialize——編譯compile——測試test——打包package——整合測試integrationTest——安裝install——部署deploy
3、常用命令 mvn complie;mvn test;mvn package; mvn clean compile;(clean作用是把之前生成的程式碼刪去)
五、座標
任何一個Maven專案,座標是唯一標識,Maven座標的元素包括groupId、artifactId、version、packaging和classifier。Maven的規則是:世界上任何一個構建都可以使用Maven座標作爲唯一標識,也是通過唯一標識,找到對應的Maven構建,如下範例所示:
<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0</version>
<packaging>jar</packaging>
1、groupId:定義當前Maven專案隸屬的實際專案
groupID的標識方式與Java包名的表示方式類似,通常與域名反向一一對應
2、artifactId:該元素定義實際專案中的一個Maven專案(模組),推薦的做法是使用實際專案名稱作爲artifactId的字首。
3、version:該元素定義了Maven專案當前所處的版本。
4、packaging:該元素定義Maven專案的打包方式
首先,打包方式通常與所生成構件的副檔名對應,比如packaging爲jar,最終的檔名爲nexus-indexer-2.0.0.jar用war作爲打包方式的Maven專案,最終生成的構建會有一個.war檔案,不過這不是絕對的。
其次,打包方式會影響構建的生命週期,比如jar打包和war打包會使用不同的命令。
最後,當不定義packaging時,Maven會使用預設值jar。
5、classifier:該元素用來幫助定義構件輸出的一些附屬構件
上述五個元素,groupId、artifacId、version是必須定義的,packaging是可選的(預設爲jar),而calssifer是不能直接定義的。
六、依賴
1、依賴範圍
maven中的依賴範圍一共有以下幾種:
compile 預設,對於編譯,測試,執行三個狀態都有效;
test 顧名思義,只針對執行test程式碼;
provided 對於編譯和測試時有效,但執行時無效,典型的時servlet-api,執行時這個由容器來提供;
runtime 對測試和執行時有效,但編譯時無效;
system 與provided的範圍一樣,但system必須顯示的指定依賴檔案,通過來進行指定,是與本機系結的,所以基本很少用到;
import 不會對3總產生實際的影響,只能在dependencyManagement中使用;
以表格來表示的,如下:
2、傳遞性依賴
我們的工程,所使用的大多數情況下,不會只有一成依賴關係,例如 a依賴b,我們用a->b表示,那麼,a->b,b->c,則a對於b是第一依賴,b對於c是第二依賴,而a對於c是傳遞性依賴。
3、依賴調節
假如有不同版本的包,他們都存在傳遞性依賴,如下
a->b->c->x(1.0)
a->b->x(2.0)
那麼此時,根據maven依賴調節第一原則最短路徑的規則,使用的x包的版本是2.0,如果當2個不同版本的包的依賴相同怎麼辦?這個時候就啓動了第二原則,也就是按pom中宣告的順序,誰先被宣告,誰優先的策略去選擇包。
七、Maven倉庫
1、Maven 倉庫是專案中依賴的第三方庫,這個庫所在的位置叫做倉庫。在 Maven 中,任何一個依賴、外掛或者專案構建的輸出,都可以稱之爲構件。Maven 倉庫能幫助我們管理構件(主要是JAR),它就是放置所有JAR檔案(WAR,ZIP,POM等等)的地方。
2、Maven 倉庫有三種類型:
(1)本地(local):Maven 的本地倉庫,在安裝 Maven 後並不會建立,它是在第一次執行 maven 命令的時候才被建立。執行 Maven 的時候,Maven 所需要的任何構件都是直接從本地倉庫獲取的。如果本地倉庫沒有,它會首先嚐試從遠端倉庫下載構件至本地倉庫,然後再使用本地倉庫的構件。
(2)中央(central):Maven 中央倉庫是由 Maven 社羣提供的倉庫,其中包含了大量常用的庫。
中央倉庫包含了絕大多數流行的開源Java構件,以及原始碼、作者資訊、SCM、資訊、許可證資訊等。一般來說,簡單的Java專案依賴的構件都可以在這裏下載到。
(3)遠端(remote):如果 Maven 在中央倉庫中也找不到依賴的檔案,它會停止構建過程並輸出錯誤資訊到控制檯。爲避免這種情況,Maven 提供了遠端倉庫的概念,它是開發人員自己定製倉庫,包含了所需要的程式碼庫或者其他工程中用到的 jar 檔案。
3、Maven 阿裡雲(Aliyun)倉庫
Maven 倉庫預設在國外, 國內使用難免很慢,我們可以更換爲阿裡雲的倉庫。
第一步:修改 maven 根目錄下的 conf 資料夾中的 setting.xml 檔案,在 mirrors 節點上,新增內容如下:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
第二步: pom.xml檔案裡新增:
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>