一、概述
Maven基於項目對象模型(POM),可以通過小段描述信息來管理項目的構建、報告和文檔的軟件項目管理工具。簡單來說,Maven可以幫助我們更加有效的管理項目,提供了倉庫的概念幫助管理第三方的jar包,最大可能的避免由於環境配置的不同所產生的問題。
Maven的下載地址:maven.apache.org,下載後解壓。
bin目錄包含mvn運行腳本,boot目錄包含類加載器的框架,maven使用其加載自己的類庫;conf下面是配置文件;lib目錄下包含了maven運行時所用到的類庫。
1. 環境配置
//打開系統環境變量配置,添加系統變量:
M2_HOME:D:\Maven\maven
Path:...;%M2_HOME%\bin
配置好後,在命令行中輸入命令mvn -v
,能出現相關版本信息則代表maven配置成功。
2. maven目錄結構
3. maven常用構建命令
mvn -v:查看maven版本
mvn compile:編譯項目
mvn test:測試
mvn package:打包項目
mvn clean:刪除target(target中存放項目經過編譯的字節碼文件和測試報告)
mvn install:安裝jar包到本地倉庫
4. 自動建立目錄骨架
maven提供了archetype插件,用於創建符合maven規定的目錄骨架
按照提示輸入項目的詳細信息:
或者使用命令
mvn archetype:generate -DgroupId=.. -DartifactId=... -Dversion=1.0.0SNAPSHOT -Dpackage=...
二、詳情
1. 座標與倉庫
座標:Maven中任何一個依賴,插件,項目構建的輸出都可以被稱爲構件,構件通過座標作爲其唯一標識。其中groupId,artifaceId,version組成項目的基本座標。
倉庫:管理項目依賴。分爲本地倉庫和遠程倉庫,在本地倉庫中未找到需要的構件就回去遠程倉庫中查找並下載到本地倉庫。
鏡像倉庫:Maven中央倉庫服務器位於國外,訪問國內的鏡像倉庫會更快更穩定。在conf下的settings中可以找到mirrors配置鏡像倉庫。
maven從遠程倉庫中下載構件默認是存放在當前用戶目錄中C:\Users\DW\.m2\repository
,可以通過修改settings中的進行修改
2. maven生命週期與插件
完整項目構建過程:清理、編譯、測試、打包、集成測試、驗證、部署
maven生命週期:
對於maven而言,沒有執行任務的功能,它的下載包也非常小,maven中的所有命令也是調用插件實現,maven官網中提供了很多的插件。在項目的pox.xml中可以添加如下配置增加插件,source插件是將源碼進行打包,綁定source到default生命週期中的package階段,其中運行目標可以在官網中查找。
3. pom.xml元素解析
pom.xml是maven項目的核心管理文件,用於項目描述,組織管理,依賴管理和構建信息管理。
<project> //根元素,包含pom的約束信息
<modelVersion> //固定版本,也是必須的元素,指定了當前pom的版本
//座標信息
<groupId>//主項目標識,定義maven屬於哪個實際的項目(組織名+項目名)
<artifaceId>//實際項目中的一個模塊(項目名+模塊名)
<version>//版本號一般由三個數字組成,snapshot快照,alpha內測,beta公測,release穩定,GA正式發佈
<packaging>//打包類型,默認是jar,也可以是var zip pom
<name>//項目描述名
<url>//項目地址
<description>//項目描述
<developers>//開發人員
<licenses>//許可證
//依賴列表
<dependencies>
<dependency>
<groupId>
<artifactId>
<version>
<type>
<scope>//依賴範圍
<optional>//設置依賴是否可選,默認false
<exclusions>//排除依賴傳遞列表
//依賴管理
<dependencyManagement>
<dependencies>//並不會引入到實際依賴,主要用在父模塊中
//爲構建行爲提供相應支持
<build>
<plugins>//插件列表
<plugin>
<groupId>
<artifactId>
<version>
<parent>//在子模塊中對父模塊pom的繼承
<modules>//聚合運行多個的maven項
4. 依賴
(1)、依賴範圍
控制依賴和classpath的關係,maven提供了三種classpath:編譯、測試、運行。
6種範圍
compile:默認範圍,編譯運行測試都有效
provided:編譯測試時有效
runtime:測試和運行時有效
test:測試時有效
system:同provided相同,但與本地系統相關聯,可移植性差
import:導入的範圍,只使用在dependencyManagement中,表示從其他pom導入dependency配置
(2)、依賴傳遞
依賴具有傳遞性,A依賴B,B依賴C,並沒有讓A依賴C,但是C會傳入到A的依賴目錄中。可以在<dependency>
添加子元素<exclusions>
除去傳遞依賴
(3)、依賴衝突
A和B依賴了不同版本的相同構建,那麼依賴於A、B的C來說究竟依賴哪個版本的構建?
有兩個選擇:短路優先,先聲明優先(路徑長度相同)
5. 繼承與聚合
多個項目install安裝到本地倉庫中,必須依次執行install,而Maven提供了聚合的方式將其放在一起運行。
新建一個Maven項,修改其packaging爲pom,使用<modules>
引入多個Maven項再install。
可以將多個項的共同特性抽象成一個父項,將<dependencies>
中的東西放入<dependencyManagement>
中,再在子類中添加<parent>