很久沒進行java方面的開發了,最近又完成了一個java相關的任務,順便從新體會了 maven 這一利器。html
在使用過程當中發現之前對maven的理解不夠深刻,藉此機會從新梳理了一下maven的核心概念。相信理解了這些核心概念, 即便長時間不使用,之後再從新上手也會很是容易。java
本文以類圖的方式,介紹maven核心的12個概念以及相互之間的關係。git
Table of Contents 1 maven管理的目標:工程(Project) 1.1 工程依賴關係 1.2 工程聚合關係 2 maven的核心:生命週期和階段 3 功能實現:插件和Goal 4 倉庫(Repository) 5 小結 1 maven管理的目標:工程(Project)github
maven是一個軟件工程(Software Project)管理工具。 對於maven來講,一個軟件工程的惟一標識是由開發者(groupId)、生成物(artifactId)、版本(version) 共同決定的。apache
每一個工程都有一個打包類型,能夠是jar, war, ear 或 pom。打包類型決定了工程最終產物的類型。 其中pom類型用於構件多模塊工程。api
工程之間有兩種關係:依賴和聚合。框架
1.1 工程依賴關係 依賴關係的管理是maven最爲人稱道的地方。一個工程能夠依賴多個其餘工程, 經過工程的惟一標識(groupId+artifactId+version)能夠明確指明依賴的庫及版本,並且可以處理 依賴關係的傳遞。 maven能夠指定依賴的做用範圍(scope),包括如下幾種:maven
scope 編譯期 測試期 運行期 說明 *compile V V V 默認scope test V 只在測試期依賴,如junit包 provided V V 運行期由容器提供,如servlet-api包 runtime V V 編譯期間不須要直接引用 system V V 編譯和測試時由本機環境提供 因爲依賴關係的傳遞性可能會致使依賴的版本、scope等發生衝突,maven提供了仲裁機制,同時也 容許本身經過配置進行依賴管理。ide
1.2 工程聚合關係 前面提到pom類型用於於構件多模塊工程,這體現了project之間的一種聚合關係: 將一系列小的模塊聚合成整個產品。工具
經過聚合後的工程能夠同時管理每一個相關模塊的構建、清理、文檔等工做。 聚合關係經過在子工程中指定一個pom類型的project做爲父project來定義。
2 maven的核心:生命週期和階段
maven將工程(Project)的構建過程理解爲不一樣的生命週期(LifeCycle)和階段(Phase)。 在工程的構建過程當中,存在着不一樣的生命週期,這些生命週期互相獨立,之間也沒有必定的順序關係。 每一個生命週期又劃分爲不一樣的階段(Phase)。階段之間有明確的順序關係, 同一輩子命週期內的階段必須按順序依次執行。
maven內置了三個生命週期,併爲每一個生命週期內置了一些階段。 下面列舉出maven內置的生命週期及主要的階段:
default:構建(Build) validate:驗證項目是否正確,全部必需的信息是否可用。 compile:編譯項目中的代碼。 test:用相關的單元測試框架測試編譯後的代碼,這些運行的測試並不會隨項目打包和佈署。 package:將編譯後的代碼打包成相應的格式文件,如jar包。 integration-test: 若是須要在一個綜合環境中運行咱們的測試,這個階段將會運行和佈署項目到該環境中。 verify: 檢查項目的包是否正確和符合要求。 install:將包安裝到本地maven倉庫,可讓其餘項目做爲依賴使用該包。 deploy:將包發佈到遠程的maven倉庫,並提供給其餘開發者使用。 clean:清理 pre-clean 準備清理 clean 執行清理工做 post-clean 執行清理後的後續工做 site:生成項目文檔和站點 pre-site 準備生成 site 生成項目站點和文檔 post-site 執行生成文檔後的後續工做 site-deploy 發佈項目文檔 更詳細的phase說明參考: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference
3 功能實現:插件和Goal
Maven中定義的工程週期和階段只是抽象的概念,不涉及具體的功能。 具體的功能由插件(Plugin)實現。一個插件能夠實現多個目標(Goal)。
爲了解耦插件的功能和工程階段,實現高度的可配置性,maven規定插件只是實現目標的功能, 經過配置來決定在哪一個階段執行(Execution)哪些目標操做。 甚至能夠把一個Goal綁定到多個Phase,以實現複用。
maven內置了一些默認的插件,並根據不一樣的工程packing類型在各個phase中默認綁定了一些goal。 下表中列出default生命週期中各階段默認綁定的goal,其中goal按照管理使用pluginname:goalname的方式標記:
Pahse Plugin:Goal process-resources resources:resources compile compiler:compile process-test-resources resources:testResources test-compile compiler:testCompile test surefire:test package ejb:ejb/ejb3:ejb3/jar:jar/par:par/rar:rar/war:war install install:install deploy deploy:deploy 最後須要說明的是,maven的插件是一種packaging類型爲maven-plugin的project, 可使用maven project的依賴,配置插件等等一切特性。
4 倉庫(Repository) 倉庫主要用於獲取工程依賴的其餘工程的生成物,也可用來部署(deploy)maven工程的生成物。 生成物包括各類打包的生成物以及pom文件。
若是有必要,一個工程能夠部署到多個倉庫。
倉庫能夠分爲本地庫(local)和遠程庫(remote)。本地庫一般位於本機的~/.m2/repository文件夾, 遠程庫最多見的是maven中央庫(),此外也會有一些私服庫用於企業內部。
http://repository.jboss.com/maven2/
5 小結 本文梳理了maven的核心概念,整個maven核心概念的全貌以下:
概念 說明 LifeCycle 生命週期,maven內置default,sie,clean三個生命週期 Phase 階段,每一個生命週期有不一樣的階段 Plugin 插件,實現實際的構建功能 Goal 一個插件能夠實現多個goal,goal具有具體的功能 Execution 經過配置,決定在某個Phase執行哪些Goal Project maven管理的目標:軟件工程,小的工程能夠聚合成大工程 PackageType 爲了便於管理工程,按照構建目標區分紅不一樣的工程類型,如jar,war,ear等 Dependency 依賴,project之間存在依賴關係 DependencyScope maven對依賴定義了不一樣的做用範圍 Management 能夠配置一個工程如何管理依賴關係 Repository 倉庫,存放包,分爲本地庫和遠程庫 Build 構建的動做。使用maven管理工程,主要是指定將project構建到某個phase Author: Holbrook Wong holbrook@holbrook.imac
Date: 2012-12-24 09:20:24 CST
HTML generated by org-mode 6.33x in emacs 23
本人已在github上用Jekyll創建了新的博客:http://thinkinside.tk/,本站文章會陸續遷移過去