因爲有少量人對Maven不瞭解,或者其餘人對Maven只是一個簡單的認識,因此這裏增長Maven基本說明,給你們瞭解Maven的一些特性,以便在從此的開發有更多的理解和啓發。java
Maven是一個項目的管理和綜合工具,他提供了開發人員構建一個完整項目的生命週期框架。在多個開發團隊環境時,Maven能夠設置按標準在很是短的時間裏完成配置工做,同時建立報表,檢查,構建和測試自動化設置。它的設置都很簡單,而且可重複使用,讓開發人員的工做更輕鬆。歸納地說,Maven簡化和標準化了項目建立的過程。處理 編譯,分配,文檔,團隊協做和其餘任務的無縫鏈接。api
總之,Maven是一種創新的軟件項目管理工具,提供了一個項目對象模型(POM)文件的新概念來管理項目的構建、相關性和文檔。他最強大的功能就是可以自動下載項目依賴庫。服務器
Maven中有有一個比較重要的概念,就是目標(Goal):表示一個特定的、對構建和管理工程有幫助的任務。它可能綁定了 0 個或多個構建階段。沒有綁定任何構建階段的目標能夠在構建生命週期以外被直接調用執行。對goal的一個定義能夠是:網絡
插件或交互的工具,這種聲明性的模式app
針對這種,在特定phase執行對工程有幫助的任務的功能,使得咱們可以使用它的一些特性(好比使用Maven原生的插件)和加入一些自定義的動做(基於Maven開發自定義的插件),爲咱們的開發提供多樣性的功能。框架
例如:mvn clean dependency:copy-dependencies package,執行mvn clean package時,能夠直接調用某個構建過程當中未被綁定的階段任務,這裏的操做是利用dependency插件的goal:copy-dependencies將項目全部依賴jar包歸檔到classpath(~/target/classes/)maven
Maven的安裝包括Linux環境下,和Windows環境下,具體安裝和說明這裏忽略。工具
這裏須要注意的是用戶配置文件:settings.xml,包含了衆多的客戶化配置,須要各位重點關注。post
Maven資源庫,顧名思義,就是Maven存放資源文件的地方,根據存放位置,他有如下幾種資源庫:單元測試
Maven本地資源庫
Maven中央倉庫 http://search.maven.org/ 或者 http://mvnrepository.com/
不論是官方Eclipse,仍是公司自研的Eclipse都已經集成了Maven,咱們能夠直接使用工具去建立一個Maven項目。依託Eclipse集成工具,咱們能夠對項目進行可視化編譯、構建、測試、打包、校驗、安裝、發佈等等操做過程。咱們不只可使用這些操做,能夠看到操做中反應的日誌,能夠獲得最終構建的結果。總之很方便,固然,也能夠本身本地嘗試。
上面說了,Maven是基於對象模型(POM)文件來構建項目的,而他另外的組成還包括src/main/java,src/main/resources,src/test/java,src/test/resources的maven標準文件結構。
結構:
生命週期其實就是一組階段的序列(sequence of phases),每一個階段定義了目標被執行的順序。Maven標準生命週期包括:
site
其中clean爲默認的清除操做,如下列出主要的構建生命週期:
生命週期階段
|
描述
|
---|---|
validate | 檢查工程配置是否正確,完成構建過程的全部必要信息是否可以獲取到。 |
initialize | 初始化構建狀態,例如設置屬性。 |
generate-sources | 生成編譯階段須要包含的任何源碼文件。 |
process-sources | 處理源代碼,例如,過濾任何值(filter any value)。 |
generate-resources | 生成工程包中須要包含的資源文件。 |
process-resources | 拷貝和處理資源文件到目的目錄中,爲打包階段作準備。 |
compile | 編譯工程源碼。 |
process-classes | 處理編譯生成的文件,例如 Java Class 字節碼的增強和優化。 |
generate-test-sources | 生成編譯階段須要包含的任何測試源代碼。 |
process-test-sources | 處理測試源代碼,例如,過濾任何值(filter any values)。 |
test-compile | 編譯測試源代碼到測試目的目錄。 |
process-test-classes | 處理測試代碼文件編譯後生成的文件。 |
test | 使用適當的單元測試框架(例如JUnit)運行測試。 |
prepare-package | 在真正打包以前,爲準備打包執行任何須要的操做。 |
package | 獲取編譯後的代碼,並按照可發佈的格式進行打包,例如 JAR、WAR 或者 EAR 文件。 |
pre-integration-test | 在集成測試執行以前,執行所需的操做。例如,設置所需的環境變量。 |
integration-test | 處理和部署必須的工程包到集成測試可以運行的環境中。 |
post-integration-test | 在集成測試被執行後執行必要的操做。例如,清理環境。 |
verify | 運行檢查操做來驗證工程包是有效的,並知足質量要求。 |
install | 安裝工程包到本地倉庫中,該倉庫能夠做爲本地其餘工程的依賴。 |
deploy | 拷貝最終的工程包到遠程倉庫中,以共享給其餘開發人員和工程。 |
注意:
Maven 核心特色之一是依賴管理。一旦咱們開始處理多模塊工程(包含數百個子模塊或者子工程)的時候,模塊間的依賴關係就變得很是複雜,管理也變得很困難。針對此種情形,Maven 提供了一種高度控制的方法:依賴管理(dependencyManagerment),依賴(dependencies)。
Maven-Project(A) Maven-Solution-Project (包含Solution-Parent) Solution-Parent
+_ dependency B (B項目依賴了log4j、netty、junit) +_ dependency Maven-Project(A) +_ dependencyManagerment
+_ dependency C (C項目依賴了xmlpull、jface、項目D) +_ dependencyManagerment +_ dependency log4j 1.0
+_ dependency D (C項目依賴了不少第三方jar包) +_ dependency 項目D +_ dependency netty 1.0
+_ dependency junit 1.0
+_ dependency xmlpull 1.0
+_ dependency jface 1.0
項目中會出現這種情形:項目A依賴於B,項目C依賴於項目A,那麼C也會依賴到B。這種機制是經過讀取工程文件(pom.xml)中的依賴項,Maven 能夠找出工程之間的依賴關係。但若是項目結構愈加龐大,項目間依賴也勢必複雜。針對這種狀況,Maven提供了一些功能去控制可遞增的依賴。
功能
|
功能描述
|
---|---|
依賴覆蓋 | 決定當多個手動建立的版本同時出現時,哪一個依賴版本將會被使用。 若是兩個依賴版本在依賴樹裏的深度是同樣的時候,第一個被聲明的依賴將會被使用。 |
依賴管理 | 直接的指定手動建立的某個版本被使用。例如當一個工程 C 在本身的以來管理模塊包含工程 B,即 B 依賴於 A, 那麼 A 便可指定在 B 被引用時所使用的版本。 |
依賴範圍 | 包含在構建過程每一個階段的依賴。 |
依賴排除 | 任何可傳遞的依賴均可以經過 "exclusion" 元素被排除在外。舉例說明,A 依賴 B, B 依賴 C,所以 A 能夠標記 C 爲 「被排除的」。 |
依賴可選 | 任何可傳遞的依賴能夠被標記爲可選的,經過使用 "optional" 元素。例如:A 依賴 B, B 依賴 C。所以,B 能夠標記 C 爲可選的, 這樣 A 就能夠再也不使用 C。 |
咱們對項目中的一些依賴,能夠限定他的做用範圍,使它在特定的執行階段去執行。
範圍
|
描述
|
---|---|
編譯階段 | 該範圍代表相關依賴是隻在工程的類路徑下有效。默認取值。 |
供應階段 | 該範圍代表相關依賴是由運行時的 JDK 或者 網絡服務器提供的。 |
運行階段 | 該範圍代表相關依賴在編譯階段不是必須的,可是在執行階段是必須的。 |
測試階段 | 該範圍代表相關依賴只在測試編譯階段和執行階段。 |
系統階段 | 該範圍代表你須要提供一個系統路徑。 |
導入階段 | 該範圍只在依賴是一個 pom 裏定義的依賴時使用。同時,當前工程的POM 文件的 部分定義的依賴關係能夠取代某特定的 POM。 |
海外的項目結構中,有一系列的業務工程,應用平臺和依賴的父項目,父項目的pom文件包含全部的公共的依賴關係,咱們稱其爲其餘子工程的父項目。
以下,核心系統依賴層次圖:
移至另一篇文章《Shell插件打包說明》
Maven項目發佈自己並不複雜,只是在集成到系統項目迭代和版本管理上面相對複雜。總體的發佈流程就是,觸發項目的發佈命令,執行Maven生命週期中的deploy階段的goal,作資源編譯以及收集,而且按照pom文件約定的插件流程,默認生成jar包,而且上傳到私服的對應位置。
上傳的位置,依據pom文件或者用戶settings文件中約定的releases和snapshots文件路徑,將項目上傳上去。
例如:項目test-1.0.0-RELEASE項目,groupId:cn.sunline.odc artifactId:test version:1.0.0-RELEASE url:http://nexus.odc.sunline.cn/repository/old-odc-public
對其進行deploy,則會上傳jar包到約定私服地址:http://nexus.odc.sunline.cn/repository/old-odc-public/cn/sunline/odc/test/1.0.0-RELEASE/test-1.0.0-RELEASE.jar