最近用到了Maven,就開始看看文檔,網(wǎng)上找找資料,看了些視頻。現(xiàn)在整理一下,僅供參考。
0x00 ? ?關(guān)于Maven
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
這是官網(wǎng)上的一段關(guān)于Maven的介紹。經(jīng)過幾天的折騰,我覺得Maven是一個開源的項目構(gòu)建、管理工具,能夠讓團隊更加高效的合作開發(fā)項目。其核心是pom文件,擁有一系列強大的插件和一個中央倉庫。
古人說的好:紙上得來終覺淺,絕知此事要躬行。至于Maven是干什么用的,怎么用,我們下載一個,安裝好,用用就知道了。或許你能夠?qū)aven理解的更進一步。
0x01 ? ?安裝Maven
接下來說一下,在windows環(huán)境下,如何安裝Maven。選用的Maven版本是apache-maven-3.3.9。
-安裝JDK
-設(shè)置Java環(huán)境變量
-設(shè)置Maven環(huán)境變量
*安裝JDK
這個就沒什么好說了。=_=
*設(shè)置Java環(huán)境變量
Control Panel -> System and Security -> System -> Advanced system settings -> Enviroment Variables
系統(tǒng)變量下 ? ?{ 注:【】只是為了強調(diào)說明 }
新建CLASSPATH
值為【.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;】
新建JAVA_HOME?
值為【C:\Program Files\Java\jdk1.8.0_91】{備注:JDK的安裝目錄}
PATH后添加【%JAVA_HOME%\bin;】
*設(shè)置Maven環(huán)境變量
下載Maven并解壓
系統(tǒng)變量下? ? { 注:【】只是為了強調(diào)說明 }
新建MAVEN_HOME -> 值為【D:\Program Files\apache-maven-3.3.9】{備注:Maven所在目錄}
PATH后添加【%MAVEN_HOME%\bin;】
在命令行窗口中,使用mvn -v來查看一下maven的版本信息,如下圖所示:
說明maven已經(jīng)安裝配置好了。
接下來說一下Maven的核心:pom文件。
0x02 ? ?pom.xml
就像Make的makefile一樣,Maven項目的核心是pom.xml。POM(Project Object Model,項目對象模型),定義了項目的基本信息,用于描述項目如何構(gòu)建,聲明項目依賴,等等。
在Eclipse中新建一個Maven Project,生成的pom.xml文件如下:
其中groupId,artifactId,version是最重要的,這三個元素定義了一個項目基本的坐標(biāo)。在Maven的世界,任何的jar,pom或者war都是以基于這些基本的坐標(biāo)進行區(qū)分的。
*groupId ?-- 定義了項目屬于哪個組,這個組往往和項目所在的組織或公司存在關(guān)聯(lián)。比如說,你在github上建立了一個名為myapp的項目,那么groupId就應(yīng)該是com.github.myapp,如果你的公司是athrob,有一個項目為cloud,那么groupId就應(yīng)該是com.athrob.cloud。
*artifactId? -- 定義了當(dāng)前maven項目在組中唯一的ID。一般使用"項目名-模塊名"來命名。
*version ?-- 指定了當(dāng)前maven項目的版本。SNAPSHOT意為快照,說明該項目還處于開發(fā)中,是不穩(wěn)定的版本。隨著項目的發(fā)展,version會不斷更新,如,升級成1.0,2.0-SNAPSHOT,2.0等。{ 注:一般第一個0表示大版本號,第二個0表示分支版本號,第三個0表示小版本號,例:0.0.1,snapshot, -- 快照;alpha, -- 內(nèi)部測試;beta, -- 公測;release, -- 穩(wěn)定版GA(General Availability) -- 正式發(fā)布的版本 }
其他標(biāo)簽:
*name ?-- 項目描述名,聲明了一個對于用戶更為友好的項目名稱。雖然這不是必須的,但是推薦為每個pom聲明name,以方便信息交流。
*package? -- 默認(rèn)是jar
*description? -- 項目描述
*dependency,exclusions,build,plugin,parent,module等見下圖所示:
關(guān)于依賴,后面我們會具體說一下依賴,依賴的沖突。以及maven的聚合和繼承。
0x03 ?Maven生命周期(clean,default,site)
clean -- 清理項目
default -- 構(gòu)件項目
site -- 生成項目站點
*clean: 三個階段
pre-clean -- 執(zhí)行清理前的工作
clean -- 清理上一次構(gòu)建生成的所有文件
post-clean -- 執(zhí)行清理后的文件
*default: (最核心)
主要有這幾個階段:compile,test,package,install
*site:
pre-site -- 在生成項目站點前要完成的工作
site -- 生成項目的站點文檔
post-site -- 在生成項目站點后要完成的工作
site-deploy -- 發(fā)布生成的站點到服務(wù)器上
0x04 ?Maven倉庫
有本地倉庫,遠(yuǎn)程倉庫,鏡像倉庫。
接下來說一下如何修改他們。
本地倉庫默認(rèn)是在~/.m2目錄下。{ ~ 表示用戶所在的家目錄,例:C:\Users\admin\.m2 }
修改maven的conf目錄下的settings.xml文件,使用localRepository標(biāo)簽,添加本地倉庫的目錄,如下圖:
這樣,我們就把Maven的本地倉庫設(shè)置為:D:/maven_repo
然后復(fù)制settings.xml文件到我們設(shè)置的本地倉庫目錄下。
遠(yuǎn)程倉庫可以理解為Maven的中央倉庫:https://repo.maven.apache.org/maven2
通過打開lib目錄下的maven-model-builder-3.3.9.jar包,依次進入org\apache\maven\model,查看pom-4.0.0.xml文件,就可以看到中央倉庫的url了。
鏡像倉庫:
依然是剛才提到的settings.xml,修改其中mirrors,mirror標(biāo)簽里的內(nèi)容,就可以修改maven的鏡像倉庫,這里我修改為OSChina的,如下圖:
0x05 ?關(guān)于Maven項目
*Maven項目主代碼和測試代碼:
默認(rèn)情況下,項目主代碼位于src/main/java目錄,測試代碼位于src/test/java目錄。
*自動創(chuàng)建符合maven規(guī)范目錄的兩種方式:
mvn archetype:generate ? ? [注:按照提示進行選擇]
mvn archetype:generate -DgroupId=組織名、公司網(wǎng)址的反寫 + 項目名?-DartifactId=項目名-模塊名?-Dversion=版本?-Dpackage=代碼所在的包名
*常用的maven命令:
mvn -v ? -- ?查看maven版本
mvn compile ? -- ?編譯
mvn test ? -- ?測試
mvn package ? -- ?打包
mvn clean ? -- ?刪除target
mvn install ? -- ?安裝jar包到本地倉庫中
也可以組合起來用,如:mvn clean package
好,接下來,說一說maven中另外一個比較重要的概念:依賴。
0x06 ?依賴
前面也提到過,在pom.xml文件中使用dependencies和dependency標(biāo)簽,來聲明依賴。
首先說一下依賴的范圍:(使用scope標(biāo)簽聲明依賴的范圍)
compile -- 默認(rèn)的范圍,編譯測試運行都有效
provided -- 在編譯和測試時有效
runtime -- 在測試和運行時有效?
test -- 只在測試時有效
system -- 與本機系統(tǒng)相關(guān)聯(lián),移植性差
import -- 導(dǎo)入的范圍,它只使用在dependencyManagement中,表示從其他的pom中導(dǎo)入dependency的配置
接下來用具體的例子來說明依賴,依賴的傳遞以及排除依賴傳遞,如下圖所示:
A,B,C分別為三個maven項目。
使用exclusions,exclusion標(biāo)簽來聲明排除依賴傳遞
接下來,說一下關(guān)于依賴的沖突。(即聲明了相同的構(gòu)件,不同的版本)
兩條原則:
1.短路優(yōu)先
A -> B -> C -> X(jar)
A -> D -> X(jar)
會優(yōu)先解析路徑短的版本
2.先聲明,先優(yōu)先
如果路徑長度相同,則誰先聲明,先解析誰
依然以圖示例,這樣會更好理解一些,如下圖所示:
A,B,C為三個Maven項目
1. 短路優(yōu)先
2. 先聲明,先優(yōu)先
0x07 ?聚合和繼承
*聚合
我對聚合的理解就是一個maven項目能夠直接對其他所有模塊項目進行管理和構(gòu)建。
如下圖所示:
A,B,C為三個maven模塊項目,新建一個all項目,通過modules,module標(biāo)簽聲明聚合。
通過對all這個項目的maven build...就實現(xiàn)對其他三個項目的構(gòu)建。查看控制臺信息,如下:
這樣就不用對每個模塊逐個進行構(gòu)建。可以看到A,B,C均構(gòu)建成功。
*繼承
跟java中繼承的概念很相似,還是以圖示例,見下圖:
可以看到,A沒有依賴,parent依賴junit-3.8.1.jar。
在A的pom.xml中使用parent標(biāo)簽表現(xiàn)來聲明繼承parent,如下圖:
可以看到,此時A就繼承了parent對junit-3.8.1.jar的依賴。
0x08 ?使用Eclipse新建一個Maven Project之webapp
首先要安裝m2eclipse插件:
在Eclipse IDE中,Help -> Install New Software... -> Add
Name: m2e
Location: http://m2eclipse.sonatype.org/sites/m2e
注:不要使用IDE內(nèi)嵌的MAVEN插件
Windows -> Perferences -> Maven -> Installations? 【取消使用IDE內(nèi)嵌的Maven插件,選擇Add添加Maven的安裝目錄】
然后更改Maven的User Settings。這里選擇本地倉庫的settings.xml文件。
然后我們開始新建一個Maven Project
Select an Archetype這一步,選擇webapp
填寫groupId,artifactId,version,package等信息。
等個一兩分鐘,項目就創(chuàng)建好了,但是會報一個jsp error的錯誤。這是因為,缺少了一個類。
解決辦法如下圖,添加Java Servlet API的依賴就好了:
此時,就OK了。剩下的可以自由發(fā)揮了。
0x09 ?其他
上面我們創(chuàng)建好的Maven Project,發(fā)現(xiàn)沒有src/main/java和src/test/java文件夾,只有一個src/main/resource文件夾。
我們更改一下項目的JRE System Library就好了。
可以看到,此時就有src/main/java和src/test/java兩個文件夾了。
使用jetty插件
訪問http://localhost:8080
使用tomcat插件
上面這里部署了在package階段運行。
訪問http://localhost:8080/webdemo
完!
不足之處,請批評指正。
如有問題,請私信聯(lián)系。
謝謝!