初識Maven及入門

最近用到了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的版本信息,如下圖所示:

mvn -v

說明maven已經(jīng)安裝配置好了。

接下來說一下Maven的核心:pom文件。


0x02 ? ?pom.xml

就像Make的makefile一樣,Maven項目的核心是pom.xml。POM(Project Object Model,項目對象模型),定義了項目的基本信息,用于描述項目如何構(gòu)建,聲明項目依賴,等等。

在Eclipse中新建一個Maven Project,生成的pom.xml文件如下:

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等見下圖所示:

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)簽,添加本地倉庫的目錄,如下圖:

local_repo

這樣,我們就把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的,如下圖:

OSChina mirror

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項目。

B依賴A
C也依賴了A

使用exclusions,exclusion標(biāo)簽來聲明排除依賴傳遞

C依賴B,不依賴A

接下來,說一下關(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)先

A-commons-io-2.4
B-commons-io-2.0
C-commons-io-2.0

2. 先聲明,先優(yōu)先

C-A-commons-io-2.4
C-B-commmons-io-2.0

0x07 ?聚合和繼承

*聚合

我對聚合的理解就是一個maven項目能夠直接對其他所有模塊項目進行管理和構(gòu)建。

如下圖所示:

A,B,C為三個maven模塊項目,新建一個all項目,通過modules,module標(biāo)簽聲明聚合。

build-all-juhe

通過對all這個項目的maven build...就實現(xiàn)對其他三個項目的構(gòu)建。查看控制臺信息,如下:

A-B-C-build-success

這樣就不用對每個模塊逐個進行構(gòu)建。可以看到A,B,C均構(gòu)建成功。

build-A-jar
build-B-jar
build-C-jar

*繼承

跟java中繼承的概念很相似,還是以圖示例,見下圖:

可以看到,A沒有依賴,parent依賴junit-3.8.1.jar。

A-no-yilai

在A的pom.xml中使用parent標(biāo)簽表現(xiàn)來聲明繼承parent,如下圖:

A-jicheng-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-user-settings

然后我們開始新建一個Maven Project

new-other
new-maven-project
use-default-workspace

Select an Archetype這一步,選擇webapp

select-an-archetype

填寫groupId,artifactId,version,package等信息。

specify-archetype-param

等個一兩分鐘,項目就創(chuàng)建好了,但是會報一個jsp error的錯誤。這是因為,缺少了一個類。

jsp-error

解決辦法如下圖,添加Java Servlet API的依賴就好了:

jsp-error-solution

此時,就OK了。剩下的可以自由發(fā)揮了。


0x09 ?其他

上面我們創(chuàng)建好的Maven Project,發(fā)現(xiàn)沒有src/main/java和src/test/java文件夾,只有一個src/main/resource文件夾。

我們更改一下項目的JRE System Library就好了。

add-JRE-System-Library
workspace default JRE
add JRE System Library
remove JRE1.5
main test folder appear

可以看到,此時就有src/main/java和src/test/java兩個文件夾了。


使用jetty插件

jetty-plugin
run as maven build...
jetty-run
started-jetty-server

訪問http://localhost:8080

localhost-8080

使用tomcat插件

tomcat-plugin

上面這里部署了在package階段運行。

tomcat-clean-package
tomcat-run

訪問http://localhost:8080/webdemo

localhost-8080-webdemo

完!


不足之處,請批評指正。

如有問題,請私信聯(lián)系。

謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內(nèi)容