Maven的定義:
Apache Maven 是一套軟件工程管理和整合工具。基于工程對象模型(POM)的概念,通過一個中央信息管理模塊,Maven 能夠管理項目的構建、報告和文檔。
Maven能做什么?
構建
文檔生成
報告
依賴
SCMs
發布
分發
郵件列表
主要是能簡化工程的構建過程,使其標準化。
POM
是一個xml文件,包含了工程和各種配置細節的信息。必須包含project元素和三個必須的字段:groupId, artifactId,version。通過這三個標識在中央倉庫中確定位置。
節點
描述
groupId
這是工程組的標識。它在一個組織或者項目中通常是唯一的。例如,一個銀行組織 com.company.bank 擁有所有的和銀行相關的項目。公司名或組織名
artifactId
這是工程的標識。它通常是工程的名稱。例如,消費者銀行。groupId 和 artifactId 一起定義了 artifact 在倉庫中的位置。項目名或項目名-子項目名
version
這是工程的版本號。在 artifact 的倉庫中,它用來區分不同的版本。例如: com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1.
查看 Super POM(父POM)默認配置的一個簡單方法是執行以下命令:
mvn help:effective-pom
構建生命周期
Maven有三個標準的生命周期
clean:用于刪除構建目錄。
default(or build):有編譯,測試,打包,部署等等操作都是在這個一個階段進行。
site:一般用來創建新的報告文檔、部署站點。
1.clean 包含以下階段:
pre-clean
clean
post-clean
2.default(or build)有23中階段:
生命周期階段
描述
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
拷貝最終的工程包到遠程倉庫中,以共享給其他開發人員和工程。
- site有以下階段:
pre-site
site
post-site
site-deploy
構建配置文件
Profile 在 pom.xml 中使用 activeProfiles / profiles 元素指定,并且可以用很多方式觸發。Profile 在構建時修改 POM,可以為不同的環境定制構建過程,比如開發環境,測試環境,產品環境。
Profile 主要有三種類型:
類型
在哪里定義
Per Project
定義在工程 POM 文件 pom.xml 中
Per User
定義在 Maven 設置 xml 文件中 (%USER_HOME%/.m2/settings.xml)
Global
定義在 Maven 全局配置 xml 文件中 (%M2_HOME%/conf/settings.xml)
Profile 有以下幾種方式激活:
顯式使用命令控制臺輸入
通過 maven 設置
基于環境變量(用戶 / 系統變量)
操作系統配置(例如,Windows family)
現存 / 缺失 文件具體怎么激活還是需要項目實戰才會有深刻的印象,這里就不具體描述了,不懂的話就去google
倉庫
用來放置存儲所有的工程 jar 文件、libraryjar文件、插件或任何其他的工程指定的文件。
本地倉庫:本機上的文件夾。
中央倉庫:由Maven社區管理,不需要配置,需要通過網絡才能訪問。
遠程倉庫:由開發人員自己定制的倉庫。
Maven依賴搜尋順序:
步驟 1 - 在本地倉庫中搜索,如果找不到,執行步驟 2,如果找到了則執行其他操作。
步驟 2 - 在中央倉庫中搜索,如果找不到,并且有一個或多個遠程倉庫已經設置,則執行步驟4,如果找到了則下載到本地倉庫中已被將來引用。
步驟 3 - 如果遠程倉庫沒有被設置,Maven 將簡單的停滯處理并拋出錯誤(無法找到依賴的文件)。
步驟 4 - 在一個或多個遠程倉庫中搜索依賴的文件,如果找到則下載到本地倉庫已被將來引用,否則 Maven 將停止處理并拋出錯誤(無法找到依賴的文件)。
插件
執行插件的語法如下:
mvn [plugin-name]:[goal-name] ;插件名稱:目標名稱
插件是在 pom.xml 中使用 plugins 元素定義的。
每個插件可以有多個目標。
你可以定義階段,插件會使用它的 phase元素開始處理。我們已經使用了 clean 階段。
你可以通過綁定到插件的目標的方式來配置要執行的任務。我們已經綁定了 echo 任務到 maven-antrun-plugin 的 run 目標。
就是這樣,Maven 將處理剩下的事情。它將下載本地倉庫中獲取不到的插件,并開始處理。插件我是這么理解的,就是感覺跟使用bash命令差不多。
依賴關系
1.傳遞性依賴
不用擔心引入多余的依賴,Maven會解析各個直接依賴的POM,將那些必要的間接依賴,以傳遞性依賴的形式引入到當前的項目中去。1. 路徑最近者優先。2. 第一聲明者優先,即順序最靠前的那個依賴優先
2.排除依賴
聲明exclusion的時候只需要groupId和artifactId即可,而不需要version元素,這是因為只需要groupId和artifactId就能唯一定位依賴圖中的某個依賴。換句話說,Maven解析后的依賴中,不可能出現groupId和artifactId相同,但是version不同的兩個依賴。
總結:
這個應該是在成熟的團隊使用的。順便了解下也是不錯的。提高篇的傳送門 以下是推薦類似功能的工具,思路都差不多。我錯過了ant時代,我也錯過了maven時代,但我不能錯過gradle時代!