Apache Maven 是一套軟件工程管理和整合工具。基於工程對象模型(POM)的概念,經過一箇中央信息管理模塊,Maven 可以管理項目的構建、報告和文檔。html
Maven 工程結構和內容被定義在一個 xml 文件中 - pom.xml,是 Project Object Model (POM) 的簡稱,此文件是整個 Maven 系統的基礎組件。java
官網地址:http://maven.apache.org/
它是使用 Maven 工做時的基本組建,是一個 xml 文件。它被放在工程根目錄下,文件命名爲 pom.xml。web
當執行一個任務或者目標時,Maven 會查找當前目錄下的 POM,從其中讀取所須要的配置信息,而後執行目標。可以在 POM 中設置的一些配置以下:apache
project dependencies
plugins
goals
build profiles
project version
developers
mailing list瀏覽器
清理 -- Clean 在進行真正的構建以前,進行清理工做 構建 -- Default 構建部分,編譯,測試,打包,部署,都在這個生命週期 站點 -- Site 生成項目報告,站點 參考連接 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
pre-clean 執行在clean以前完成的工做 clean 清除上一次構建生成的文件 post-clean 執行在clean以後馬上完成的工做
pre-site 執行在生成站點文檔以前完成的工做 site 生成項目的站點文檔 post-site 執行生成站點文檔以後的工做 site-deploy 將生成的站點文檔部署到特定的服務器上
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倉庫存儲全部的工程 jar 文件、library jar 文件、插件或任何其餘的工程指定的文件。java-web
Maven 倉庫有三種類型:
本地倉庫 local
中央倉庫 central
遠程倉庫 remoteapp
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
Maven 中央倉庫是由 Maven 社區提供的倉庫,其中包含了大量也是最全面的經常使用的資源。
要瀏覽中央倉庫的內容,maven 社區提供了一個 URL:http://search.maven.org/#browse。使用這個倉庫,開發人員能夠搜索全部能夠獲取的代碼庫。
若是 Maven 在中央倉庫中也找不到依賴的庫文件,它會中止構建過程並輸出錯誤信息到控制檯。爲避免這種狀況,Maven 提供了遠程倉庫的概念,它是開發人員本身定製倉庫,包含了所須要的庫文件。
步驟 1 ,在本地倉庫中搜索,若是找不到,執行步驟 2,若是找到了則執行其餘操做。
步驟 2 ,在中央倉庫中搜索,若是找不到,而且遠程倉庫已設置,則執行步驟 4,若是找到了則下載到本地倉庫。
步驟 3 ,若是遠程倉庫沒有被設置,Maven 將簡單的停滯處理並拋出錯誤(沒法找到依賴的文件的錯誤)。
步驟 4 ,在一個或多個遠程倉庫中搜索依賴的文件,若是找到則下載到本地倉庫,不然 Maven 將中止處理並拋出錯誤(沒法找到依賴的文件的錯誤)。
因爲Maven工程中是使用groupId, artifactId, version惟必定義的,因此咱們能夠根據此惟一標識,在POM中定義對其餘工程的依賴
當一個庫 A 依賴於其餘庫 B. 另外一工程 C 想要使用庫 A, 那麼該工程一樣也須要使用到庫 B, Maven 能夠避免去搜索全部須要的庫資源的這種需求。經過讀取工程文件(pom.xml)中的依賴項,Maven 能夠找出工程之間的依賴關係。咱們只須要在每一個工程的 pom 文件裏去定義直接的依賴關係。Maven 則會自動的來接管後續的工做。
可是,經過傳遞依賴,全部被包含的庫的圖形可能會快速的增加。當重複的庫存在時,可能出現的情形將會持續上升(此處會經過實際工程舉例說明)。Maven 提供一些功能來控制可傳遞的依賴的程度。
決定當多個手動建立的版本同時出現時,哪一個依賴版本將會被使用。 若是兩個依賴版本在依賴樹裏的深度是同樣的時候,第一個被聲明的依賴將會被使用。好比,A -> B -C D->E-C 那麼若是A先聲明,則先使用A依賴的C。若是深度不一致,則優先採用最短路徑,選取依賴庫。
Maven提供dependencyManagement 元素既能讓子模塊繼承到父模塊的依賴配置,又能保證自模塊依賴的使用靈活性。 即,在繼承時,繼承的是配置,而不是總體繼承依賴,子POM中,引用時不須要引用版本號,若是子POM的對應上級POM的Dependency帶有版本,則會覆蓋從父模塊繼承下來的該依賴。
compile 編譯範圍
默認範圍,若是沒有提供範圍,那麼依賴範圍就是編譯範圍;
provided 已提供範圍
若是範圍是provided,那麼當JDK,或容器已經提供該依賴以後才使用這個依賴,非傳遞性的,不會被打包;
runtime 運行時範圍
若是一個依賴是runtime依賴範圍,那麼該依賴在運行和測試系統的時候才使用,在編譯和打包的時候不須要,好比,在編譯時,只須要JDBC API Jar文件,而只有在測試和運行的時候才須要JDBC的具體實現的Jar文件
test 測試範圍
只有在測試和測試編譯的時候須要,不會被打包
system 系統範圍(通常不推薦)
若是一個依賴的依賴範圍是系統範圍,那麼必須顯示的提供一個本地系統中的JAR文件的路徑,也就是說Maven不會在倉庫中查找依賴,而是直接引用這個外部依賴,以保障編譯和運行。
任何可傳遞的依賴均可以經過 "exclusion" 元素被排除在外。舉例說明,A 依賴 B, B 依賴 C,所以 A 能夠標記 C 爲 「被排除的」。
A編譯時有一個依賴B,但對於B中的功能並不必定是使用的,因此當C引用A時並不必定須要在運行時引用B, 這時A依賴B標記爲可選依賴,若是C真正須要B時,則顯示聲明依賴B。
將 http://repo1.maven.org/maven2/archetype-catalog.xml 文件下載到本地,並複製到maven 倉庫中,以下目錄 ~\repository\org\apache\maven\archetype\archetype-catalog\2.x 在附件other-resources文件夾下能夠找到已經下載好的該文件
進入控制檯,執行以下命令 mvn archetype:generate -DgroupId=org.gh.mavenx -DartifactId=simple -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeCatalog=local 能夠建立
進入控制檯,執行以下命令 mvn clean package 便可在」工程名/target」目錄下生成war包
將war包copy至Tomcat下,用瀏覽器成功查看。
執行以下命令查看 mvn help:effective-pom 能夠看到輸出至控制檯的是包含默認設置的pom.xml
執行 mvn clean compile 或 mvn clean package 再執行 mvn compile clean 或 mvn package clean 查看效果,說明這兩個標準的生命週期之間是互相獨立的。
Note: 「maven-jar-plugin 插件的jar目標,被綁定到package階段」,」一個階段能夠綁定多個目標,一個插件能夠由多個目標組成」 執行 mvn clean jar:jar 查看所打包的jar包的內容 再執行 mvn clean compile jar:jar 再次查看打包的內容,對比以前執行的mvn package效果,經過兩次查看效果,能夠清晰的看出,maven-jar-plugin這個插件,包含目標jar, 只有package階段有此能力,此目標被綁定到package階段
執行 mvn xxx 查看有序性效果
mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull
版權全部,轉載須要標註出處:GavinHacker: http://www.cnblogs.com/gavinsp/p/6377227.html