好久沒進行java方面的開發了,最近又完成了一個java相關的任務,順便重新體會了 maven 這一利器。
在使用過程中發現以前對maven的理解不夠深入,藉此機會重新梳理了一下maven的核心概念。相信理解了這些核心概念, 即使長時間不使用,以後再重新上手也會非常容易。
本文以類圖的方式,介紹maven核心的12個概念以及相互之間的關係。
Table of Contents
1 maven管理的目標:工程(Project)
maven是一個軟體工程(Software Project)管理工具。 對於maven來說,一個軟體工程的唯一標識是由開發者(groupId)、生成物(artifactId)、版本(version) 共同決定的。
每個工程都有一個打包型別,可以是jar, war, ear 或 pom。打包型別決定了工程最終產物的型別。 其中pom型別用於構件多模組工程。
工程之間有兩種關係:依賴和聚合。
1.1 工程依賴關係
依賴關係的管理是maven最為人稱道的地方。一個工程可以依賴多個其他工程, 通過工程的唯一標識(groupId+artifactId+version)可以明確指明依賴的庫及版本,而且能夠處理 依賴關係的傳遞。 maven可以指定依賴的作用範圍(scope),包括以下幾種:
scope | 編譯期 | 測試期 | 執行期 | 說明 |
---|---|---|---|---|
*compile | V | V | V | 預設scope |
test | V | 只在測試期依賴,如junit包 | ||
provided | V | V | 執行期由容器提供,如servlet-api包 | |
runtime | V | V | 編譯期間不需要直接引用 | |
system | V | V | 編譯和測試時由本機環境提供 |
由於依賴關係的傳遞性可能會導致依賴的版本、scope等發生衝突,maven提供了仲裁機制,同時也 允許自己通過配置進行依賴管理。
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中央庫(),此外也會有一些私服庫用於企業內部。
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 |
Date: 2012-12-24 09:20:24 CST
HTML generated by org-mode 6.33x in emacs 23