Maven 概要介紹

Maven 簡介

Apache Maven 是一套軟件工程管理和整合工具。基於工程對象模型(POM)的概念,經過一箇中央信息管理模塊,Maven 可以管理項目的構建、報告和文檔。html

Maven 工程結構和內容被定義在一個 xml 文件中 - pom.xml,是 Project Object Model (POM) 的簡稱,此文件是整個 Maven 系統的基礎組件。java

官網地址:http://maven.apache.org/

Maven 的另一個定義

Paste_Image.png

(一) Maven - POM

1. POM 表明工程對象模型。

它是使用 Maven 工做時的基本組建,是一個 xml 文件。它被放在工程根目錄下,文件命名爲 pom.xml。web

2. POM 也包含了目標和插件。

當執行一個任務或者目標時,Maven 會查找當前目錄下的 POM,從其中讀取所須要的配置信息,而後執行目標。可以在 POM 中設置的一些配置以下:apache

project dependencies
plugins
goals
build profiles
project version
developers
mailing list瀏覽器

3. 在建立 POM 以前,咱們首先肯定工程組(groupId),及其名稱(artifactId)和版本,在倉庫中這些屬性是工程的惟一標識。
4. 全部的Maven項目都擴展自超級POM, 咱們能夠在maven安裝目錄中找到並查看到。

(二) Maven 的生命週期

1. Maven的生命週期分爲三種標準的生命週期
清理 -- Clean      在進行真正的構建以前,進行清理工做
構建 -- Default   構建部分,編譯,測試,打包,部署,都在這個生命週期
站點 -- Site  生成項目報告,站點
參考連接 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
(1)Clean分爲如下階段
pre-clean  執行在clean以前完成的工做
clean  清除上一次構建生成的文件
post-clean  執行在clean以後馬上完成的工做
(2)Site 有如下階段
pre-site     執行在生成站點文檔以前完成的工做
site    生成項目的站點文檔
post-site     執行生成站點文檔以後的工做
site-deploy     將生成的站點文檔部署到特定的服務器上
(3)Default有如下(重要)階段
validate    驗證工程是否正確,而且必要信息是否可用
initialize  初始化build狀態等工做,設置屬性或建立目錄
prepare-resources   拷貝資源
compile 編譯源代碼
test-compile  編譯單元測試源代碼
test    單元測試,代碼不被打包和部署
package     獲取編譯好的代碼,並根據其可發佈的格式進行打包,好比Jar,    War
install     安裝包到本地的倉庫,使其被本地的其餘工程所依賴
deploy  複製最終的包到遠程的倉庫,分享給其餘的開發者或者項目

以上爲重要階段,所有階段需參考文檔:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html服務器

(三) Maven 倉庫

1. 基本概念

Maven倉庫存儲全部的工程 jar 文件、library jar 文件、插件或任何其餘的工程指定的文件。java-web

2. 倉庫類型

Maven 倉庫有三種類型:
本地倉庫 local
中央倉庫 central
遠程倉庫 remoteapp

i. 本地倉庫

Maven 的本地倉庫,在你第一次運行任何 maven 命令的時候建立的,默認被建立在 %USER_HOME% 目錄下。要修改默認位置,在 %M2_HOME%\conf 目錄中的 Maven 的 settings.xml 文件中定義另外一個路徑,如: D:/T/RexenBMSite/RexenBMSite/doc/maven/maven/repository webapp

Maven 本地倉庫保存你的工程的全部依賴(library jar、plugin jar 等)。當你運行一次 Maven 構建,Maven 會自動下載全部依賴的 jar 文件到本地倉庫中。它避免了每次構建時都引用遠程機器上的依賴文件。maven

ii. 中央倉庫

Maven 中央倉庫是由 Maven 社區提供的倉庫,其中包含了大量也是最全面的經常使用的資源。
要瀏覽中央倉庫的內容,maven 社區提供了一個 URL:http://search.maven.org/#browse。使用這個倉庫,開發人員能夠搜索全部能夠獲取的代碼庫

iii. 遠程倉庫

若是 Maven 在中央倉庫中也找不到依賴的庫文件,它會中止構建過程並輸出錯誤信息到控制檯。爲避免這種狀況,Maven 提供了遠程倉庫的概念,它是開發人員本身定製倉庫,包含了所須要的庫文件。

3. Maven對於依賴庫的搜索順序

步驟 1 ,在本地倉庫中搜索,若是找不到,執行步驟 2,若是找到了則執行其餘操做。
步驟 2 ,在中央倉庫中搜索,若是找不到,而且遠程倉庫已設置,則執行步驟 4,若是找到了則下載到本地倉庫。
步驟 3 ,若是遠程倉庫沒有被設置,Maven 將簡單的停滯處理並拋出錯誤(沒法找到依賴的文件的錯誤)。
步驟 4 ,在一個或多個遠程倉庫中搜索依賴的文件,若是找到則下載到本地倉庫,不然 Maven 將中止處理並拋出錯誤(沒法找到依賴的文件的錯誤)。

(四) Maven 依賴管理

因爲Maven工程中是使用groupId, artifactId, version惟必定義的,因此咱們能夠根據此惟一標識,在POM中定義對其餘工程的依賴

1. 傳遞依賴

當一個庫 A 依賴於其餘庫 B. 另外一工程 C 想要使用庫 A, 那麼該工程一樣也須要使用到庫 B, Maven 能夠避免去搜索全部須要的庫資源的這種需求。經過讀取工程文件(pom.xml)中的依賴項,Maven 能夠找出工程之間的依賴關係。咱們只須要在每一個工程的 pom 文件裏去定義直接的依賴關係。Maven 則會自動的來接管後續的工做。

可是,經過傳遞依賴,全部被包含的庫的圖形可能會快速的增加。當重複的庫存在時,可能出現的情形將會持續上升(此處會經過實際工程舉例說明)。Maven 提供一些功能來控制可傳遞的依賴的程度。

2. 依賴控制
(1)依賴調節

決定當多個手動建立的版本同時出現時,哪一個依賴版本將會被使用。 若是兩個依賴版本在依賴樹裏的深度是同樣的時候,第一個被聲明的依賴將會被使用。好比,A -> B -C D->E-C 那麼若是A先聲明,則先使用A依賴的C。若是深度不一致,則優先採用最短路徑,選取依賴庫。

(2)依賴管理(Dependency Management)

Maven提供dependencyManagement 元素既能讓子模塊繼承到父模塊的依賴配置,又能保證自模塊依賴的使用靈活性。 即,在繼承時,繼承的是配置,而不是總體繼承依賴,子POM中,引用時不須要引用版本號,若是子POM的對應上級POM的Dependency帶有版本,則會覆蓋從父模塊繼承下來的該依賴。

(3)依賴範圍

compile 編譯範圍
默認範圍,若是沒有提供範圍,那麼依賴範圍就是編譯範圍;
provided 已提供範圍
若是範圍是provided,那麼當JDK,或容器已經提供該依賴以後才使用這個依賴,非傳遞性的,不會被打包;
runtime 運行時範圍
若是一個依賴是runtime依賴範圍,那麼該依賴在運行和測試系統的時候才使用,在編譯和打包的時候不須要,好比,在編譯時,只須要JDBC API Jar文件,而只有在測試和運行的時候才須要JDBC的具體實現的Jar文件
test 測試範圍
只有在測試和測試編譯的時候須要,不會被打包
system 系統範圍(通常不推薦)
若是一個依賴的依賴範圍是系統範圍,那麼必須顯示的提供一個本地系統中的JAR文件的路徑,也就是說Maven不會在倉庫中查找依賴,而是直接引用這個外部依賴,以保障編譯和運行。

(4)排除依賴

任何可傳遞的依賴均可以經過 "exclusion" 元素被排除在外。舉例說明,A 依賴 B, B 依賴 C,所以 A 能夠標記 C 爲 「被排除的」。

(5)可選依賴

A編譯時有一個依賴B,但對於B中的功能並不必定是使用的,因此當C引用A時並不必定須要在運行時引用B, 這時A依賴B標記爲可選依賴,若是C真正須要B時,則顯示聲明依賴B。

(五)建立第一個maven工程

(1) 準備工做
將 http://repo1.maven.org/maven2/archetype-catalog.xml  文件下載到本地,並複製到maven 倉庫中,以下目錄
        ~\repository\org\apache\maven\archetype\archetype-catalog\2.x
在附件other-resources文件夾下能夠找到已經下載好的該文件
(2) 建立java web工程
進入控制檯,執行以下命令    
mvn archetype:generate -DgroupId=org.gh.mavenx -DartifactId=simple -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeCatalog=local
    能夠建立
(3)打包
進入控制檯,執行以下命令
mvn clean package
便可在」工程名/target」目錄下生成war包
(4)測試
將war包copy至Tomcat下,用瀏覽器成功查看。
(5)查看該maven工程真正運行所根據的pom
執行以下命令查看
mvn help:effective-pom
能夠看到輸出至控制檯的是包含默認設置的pom.xml
(6)理解clean 和 default 生命週期的獨立性
執行   mvn clean compile 或 mvn clean package 
再執行 mvn compile clean 或 mvn package clean 
查看效果,說明這兩個標準的生命週期之間是互相獨立的。
(7)理解插件,目標,和階段的關係
Note: 「maven-jar-plugin 插件的jar目標,被綁定到package階段」,」一個階段能夠綁定多個目標,一個插件能夠由多個目標組成」
執行 mvn clean jar:jar
查看所打包的jar包的內容
再執行 mvn clean compile jar:jar
再次查看打包的內容,對比以前執行的mvn package效果,經過兩次查看效果,能夠清晰的看出,maven-jar-plugin這個插件,包含目標jar,  只有package階段有此能力,此目標被綁定到package階段
(8)理解maven生命週期 的各個階段的有序性
執行 mvn xxx 查看有序性效果
(9)查看maven插件信息
mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull

版權全部,轉載須要標註出處:GavinHacker: http://www.cnblogs.com/gavinsp/p/6377227.html

相關文章
相關標籤/搜索