這篇文章會(huì)將筆者站在實(shí)用角度認(rèn)為 maven 最重要的知識(shí)抽象提取出來(lái),直擊重點(diǎn),從理論層面帶你快速理解什么是 maven。
內(nèi)容預(yù)覽:
- maven 的概念與作用
- maven 生命周期
- maven 使用方式
- maven 最佳實(shí)踐(搭建自己的開(kāi)發(fā)框架)
一、maven介紹
maven概念
maven是一個(gè)項(xiàng)目包管理工具,也是一種項(xiàng)目框架,滿足maven項(xiàng)目結(jié)構(gòu)規(guī)范的項(xiàng)目被稱為maven項(xiàng)目。作為工具,maven可以用來(lái)完成外部工具包的導(dǎo)入,它的功能還遠(yuǎn)遠(yuǎn)高于管理包的導(dǎo)入:
管理外部依賴包的導(dǎo)入:
在沒(méi)接觸過(guò)maven的開(kāi)發(fā)者,相信很多人都有為導(dǎo)入外部依賴包的繁瑣操作而煩惱。以連接 MySQL 數(shù)據(jù)庫(kù)的 Java 依賴包為例,在先前剛學(xué) JavaWeb 尚未接觸 maven 時(shí),若想添加 mysql-connector-java 工具包,要在網(wǎng)上把工具包下載下來(lái),再通過(guò)IDE或者其他方式添加到開(kāi)發(fā)項(xiàng)目里,其他工具也同樣如此,如果需要更換版本,則得重新下載新版本的包文件再導(dǎo)入。
如果使用 maven,事情會(huì)有很大不同。每個(gè) maven 項(xiàng)目都會(huì)有一個(gè) pom.xml 文件(Project Object Model),導(dǎo)入工具包的過(guò)程將變?yōu)榱诵薷?maven 項(xiàng)目的 pom.xml,在<dependencies>標(biāo)簽里面加入需導(dǎo)入工具包的<dependency>標(biāo)簽,可以在官方倉(cāng)庫(kù)網(wǎng)站搜索你需要的工具包的<dependency>。需更改版本時(shí),只改動(dòng)<dependency>標(biāo)簽里面的<version>標(biāo)簽即可。
配置好 pom.xml 后,只需在 pom.xml 的路徑中執(zhí)行mvn install,即可將依賴包下載到本地倉(cāng)庫(kù),集中管理,如果有項(xiàng)目需要用這個(gè)包,則直接從本地倉(cāng)庫(kù)里獲取。同樣具有這種功能的工具還有 Gradle、Ant。功能遠(yuǎn)不止依賴包管理:
maven 不僅僅可以為 maven 項(xiàng)目管理依賴包,它還可以將每個(gè) maven 項(xiàng)目當(dāng)作依賴包,甚至項(xiàng)目與項(xiàng)目之間還可以有面向?qū)ο筇匦缘睦^承關(guān)系,每個(gè)項(xiàng)目是一個(gè)對(duì)象,項(xiàng)目里的所有內(nèi)容是對(duì)象的屬性,子項(xiàng)目可以繼承父項(xiàng)目的所有內(nèi)容。這樣使得每個(gè)項(xiàng)目的獨(dú)特性可以更強(qiáng),項(xiàng)目與項(xiàng)目之間的耦合度可以很低 —— 像制作積木一樣寫(xiě)項(xiàng)目,需要用時(shí)將積木拼湊起來(lái)構(gòu)成應(yīng)用。
對(duì)于復(fù)用性非常強(qiáng)、對(duì)生產(chǎn)力提升很大的項(xiàng)目模塊,甚至還可以上傳到 maven 官方倉(cāng)庫(kù)讓其他人也能享受便利,若不便公開(kāi),可以傳至內(nèi)部局域網(wǎng)的倉(cāng)庫(kù)(例如公司內(nèi)網(wǎng))。
maven倉(cāng)庫(kù)
maven 在導(dǎo)入依賴包時(shí),會(huì)按以下順序在倉(cāng)庫(kù)中逐個(gè)尋找需要導(dǎo)入的包
- 本地倉(cāng)庫(kù):當(dāng)前計(jì)算機(jī)的 maven 倉(cāng)庫(kù),默認(rèn)會(huì)有一個(gè)專門(mén)的文件夾作為本地倉(cāng)庫(kù)
- 遠(yuǎn)程倉(cāng)庫(kù):也被稱為"內(nèi)網(wǎng)倉(cāng)庫(kù)",默認(rèn)沒(méi)有,可通過(guò)標(biāo)簽<repositories>進(jìn)行配置
- 官方倉(cāng)庫(kù):默認(rèn)為官方倉(cāng)庫(kù),可通過(guò)標(biāo)簽<mirrors>進(jìn)行鏡像設(shè)置,例如阿里云的maven官方倉(cāng)庫(kù)鏡像 https://maven.aliyun.com/
Maven 項(xiàng)目中依賴的搜索順序?qū)嶒?yàn) - 云棲社區(qū)
結(jié)論:(檢索項(xiàng)目依賴優(yōu)先級(jí))local_repo > settings_profile_repo > pom_profile_repo > pom_repositories > settings_mirror > central
生命周期
maven官方文檔:入門(mén)指南 - 生命周期
以下是build一個(gè)項(xiàng)目時(shí),可選的生命周期,也被稱為"構(gòu)建生命周期",選擇一個(gè)生命周期后,maven會(huì)按下方的順序依次執(zhí)行各個(gè)生命周期,直至所選的那個(gè)生命周期執(zhí)行結(jié)束。例如如果選擇了 package,則會(huì)從 validate 執(zhí)行至 package,不需要進(jìn)行后面的 verify、install、deploy。
-
validate- 驗(yàn)證項(xiàng)目的結(jié)構(gòu)是否正確 -
compile- 編譯項(xiàng)目源碼 -
test- 執(zhí)行測(cè)試用例(如果有),完成單元測(cè)試 -
package- 將項(xiàng)目按配置的格式打包(常用) -
verify- 對(duì)集成測(cè)試的結(jié)果進(jìn)行檢查 -
install- 將打好的包發(fā)布到本地倉(cāng)庫(kù),供其他項(xiàng)目使用(常用) -
deploy- 將項(xiàng)目包發(fā)布到遠(yuǎn)程倉(cāng)庫(kù),供其他開(kāi)發(fā)者分享使用
除了上面的"構(gòu)建生命周期",maven還有另外兩個(gè)生命周期指令,分別是:
-
clean- 屬于clean什么周期,用于清理項(xiàng)目已創(chuàng)建的所有文件(常用) -
site- 屬于site什么周期,用于生成項(xiàng)目的文檔(不常用)
使用方式
- 命令行操作,將maven的啟動(dòng)目錄配置為環(huán)境變量,即可在任意路徑下執(zhí)行 mvn 指令了;
- 使用IDE創(chuàng)建maven項(xiàng)目,通過(guò)IDE的maven指令管理進(jìn)行操作,主流的Java開(kāi)發(fā)IDE都支持maven項(xiàng)目,這里不贅述細(xì)節(jié);
Eclipse構(gòu)建Maven項(xiàng)目 - 易百教程
在IDEA中創(chuàng)建maven項(xiàng)目
常見(jiàn)標(biāo)簽
<groupId>
位置:pom.xml
作用:定義項(xiàng)目所在的組號(hào),類似于java文件的package值
舉例 :
<groupId>com.zty</groupId>
<artifactId>
位置:pom.xml
作用:定義項(xiàng)目的名稱,與groupId共同構(gòu)成唯一的項(xiàng)目索引,類似于java文件的class值
舉例 :
<artifactId>account</artifactId>
<version>
位置:pom.xml
作用:定義項(xiàng)目的版本號(hào),供項(xiàng)目的依賴者進(jìn)行選擇
舉例 :
<version>1.1.0</version>
<properties>
位置:pom.xml
作用:定義屬性值,同一項(xiàng)目的其他地方可以通過(guò)EL表達(dá)式(${ })來(lái)獲取這些屬性值的內(nèi)容,這樣做的目的是統(tǒng)一管理那些被多次使用的內(nèi)容
舉例 :
<version>${zty-framework.version}</version>
...
<properties>
<zty-framework.version>0.8.1</zty-framework.version>
<spring-web.version>5.2.3.RELEASE</spring-web.version>
<fastjson.version>1.2.68</fastjson.version>
</properties>
<parent>
位置:pom.xml
作用:聲明當(dāng)前項(xiàng)目繼承的父項(xiàng)目,類似于java文件的extends,子項(xiàng)目將會(huì)繼承父項(xiàng)目的所有內(nèi)容,包括父項(xiàng)目的<properties>
舉例 :
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
<packaging>
位置:pom.xml
作用:聲明當(dāng)前項(xiàng)目的打包格式,默認(rèn)值為jar,可選值為war、jar、pom
舉例 :
<packaging>war</packaging>
<module>
位置:pom.xml - <modules>
作用:定義當(dāng)前項(xiàng)目的子模塊,必須與<packaging>pom</packaging>配套使用(所有被繼承的項(xiàng)目的packaging必須為pom)
舉例 :
<packaging>pom</packaging>
...
<modules>
<module>wx</module>
<module>file</module>
<module>account</module>
<module>redis</module>
<module>wheel-gateway</module>
<module>framework</module>
</modules>
<repository>
位置:setting.xml - <repositories>
作用:定義"遠(yuǎn)程倉(cāng)庫(kù)",例如公司內(nèi)部的maven倉(cāng)庫(kù)地址
舉例 :
<repositories>
<repository>
<id>pom_repositories</id>
<name>XX_Company</name>
<url>http://10.18.29.128/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependency>
位置:pom.xml - <dependencies>
作用:用于指明需要引入的依賴
舉例 :
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.2</version>
<classifier>jdk15</classifier>
<scope>compile</scope> <!-- 可選值為: compile test provided runtime system -->
</dependency>
<plugins>
位置:pom.xml - <build>或<reporting>
作用:指明用于覆蓋maven默認(rèn)操作的工具。maven指令的執(zhí)行,其實(shí)也是基于插件進(jìn)行的,maven有一套默認(rèn)的官方插件,如果在項(xiàng)目pom.xml里引入plugins,執(zhí)行maven指令操作時(shí)將會(huì)優(yōu)先基于plugins的邏輯對(duì)項(xiàng)目進(jìn)行操作,而不是maven默認(rèn)的官方插件,例如Springboot打包的原理就是引入了專門(mén)的springboot-plugins。<build>對(duì)應(yīng)于打包操作,<reporting>對(duì)應(yīng)于報(bào)告。
舉例 :
...
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
二、使用maven的最佳實(shí)踐
關(guān)于使用maven的最佳實(shí)踐,可參考我的另一篇文章:
三、本文總結(jié)
從實(shí)用角度看,maven主要有兩大核心作用:
- 管理外部依賴包的導(dǎo)入;
- 將項(xiàng)目做成依賴包,使我們可以使用面向?qū)ο笏枷牍芾眄?xiàng)目;
最后,如果你對(duì)文章內(nèi)容存在疑惑,歡迎添加我的個(gè)人微信進(jìn)行交流,如果你覺(jué)得文章寫(xiě)得不錯(cuò),給我點(diǎn)個(gè)贊吧 ^_^