Maven介紹

1. maven概念模型

????????Maven 是Apache下的一個開源項目嗦哆,它是一個創(chuàng)新的項目管理工具招狸,它用于對Java項目進行項目構(gòu)建兄世、依賴管理及項目信息管理啼辣。

? ? ? ? Maven 包含了一個項目對象模型 (Project Object Model),一組標準集合御滩,一個項目生命周期(Project Lifecycle)鸥拧,一個依賴管理系統(tǒng)(Dependency Management System),和用來運行定義在生命周期階段(phase)中插件(plugin)目標(goal)的邏輯


?>>項目對象模型(Project Object Model)

????????通過pom.xml文件定義項目的坐標削解、項目依賴富弦、項目信息、插件目標氛驮、打包方式等腕柜。

?>>依賴管理系統(tǒng)(Dependency Management System)

????????通過定義項目所依賴組件的坐標有maven進行依賴管理。

????????比如:項目依賴spring-context, 通過在pom.xml中定義依賴即可將spring-context的jar包自動加入到工程:

pom.xml中定義依賴:

????????????<dependency>

? ? ? ? ? ? ? ????????????<groupId>org.springframework</groupId>

? ? ? ? ? ? ? ????????????<artifactId>spring-context</artifactId>

? ? ? ? ? ? ? ????????????<version>4.2.4.RELEASE</version>

????????????</dependency>

>>一個項目生命周期(Project Lifecycle)

????????一個軟件開發(fā)人員每天都在完成項目的生命周期:清理矫废、編譯盏缤、測試、部署蓖扑,有的手工完成唉铜,有的通過Ant(項目構(gòu)建工具)腳本自動完成,maven將項目生命周期抽象統(tǒng)一為:清理律杠、初始化潭流、編譯竞惋、測試、報告灰嫉、打包拆宛、部署、站點生成等熬甫。Maven就是要保證一致的項目構(gòu)建流程胰挑,通過執(zhí)行一些簡單的命令即可實現(xiàn)上面生命周期的各個過程。

>>插件(plugin)目標(goal)

????????maven管理項目生命周期過程都是基于插件完成的椿肩。

2.maven的倉庫

????????maven工程需要配置倉庫瞻颂,本地的項目A項目B等通過maven從遠程倉庫(網(wǎng)絡(luò)上的倉庫)下載jar包并存在本地倉庫,本地倉庫就是本地文件夾郑象,當?shù)诙涡枰薺ar包時則不需要從遠程倉庫下載贡这,因為本地倉庫已經(jīng)存在了,可以將本地倉庫理解為緩存厂榛,有了本地倉庫就不用每次從遠程倉庫下載盖矫。

?????? Maven倉庫類型

????????1).本地倉庫:用來存儲遠程倉庫貨中央倉庫下載的插件和jar包,項目使用一些插件或jar包击奶,優(yōu)先從本地倉庫查找辈双。

????????2).遠程倉庫:如果本地需要插件或者jar包,本地倉庫沒有柜砾,默認去遠程倉庫下載湃望。

????????3).中央倉庫:在maven環(huán)境內(nèi)部內(nèi)置一個遠程倉庫地址http://repo1.maven.org/maven2,它是中央倉庫,服務(wù)于整個互聯(lián)網(wǎng)痰驱,它是由maven自己維護证芭,里面有大量的常用類庫,并包含該了世界上大部分流行的開源項目構(gòu)件担映。

3.項目生命周期

????????Maven有三套項目獨立的生命周期废士,請注意這里說的是“三套”,而且是“相互獨立”蝇完,這三套生命周期分別是:

????????Clean Lifecycle 在進行真正的構(gòu)建之前進行一些清理工作官硝。

????????Default Lifecycle 構(gòu)建的核心部分,編譯短蜕、測試氢架、打包、部署等等忿危。

????????Site Lifecycle 生成項目報告达箍、站點、發(fā)布站點。

4.Maven依賴管理

4.1 坐標管理

4.1.1 坐標定義

????maven通過坐標定義每一個構(gòu)建成畦,在pom.xml中定義坐標:

?????? groupId: 定義當前Maven項目名稱

?????? artifactId:? 定義項目模塊

?????? version:???????? 定義當前項目的當前版本

4.1.2?查找坐標

????方法一: 使用網(wǎng)站搜索

????????http:// search.maven.org/

????????http:// mvnrespository.com/


???方法二:使用maven插件的索引功能(本地倉庫)

4.2 添加依賴

4.2.1 通過坐標導入依賴

????在pom.xml文件中右鍵



4.2.1 依賴范圍scope

????????A依賴B,需要在A的pom.xml文件中添加B的坐標咱士,添加坐標是需要制定依賴范圍赃磨,依賴范圍包括:

????????????1) compile:當依賴的scope為compile的時候,那么當前這個依賴的包,會在編譯的時候?qū)⑦@個依賴加入進來筝家,并且在打包(mvn package)的時候也會將這個依賴加入進去意思就是:編譯范圍有效,在編譯與打包時都會存儲進去邻辉。在默認的情況下scope的范圍是compile溪王。

????????????2) ?provided: 當依賴的scope為provided的時候,在編譯和測試的時候有效值骇,在執(zhí)行(mvn package)進行打包成war包的時候不會加入莹菱,比如:servlet-api,因為servlet-api吱瘩,tomcat等web服務(wù)器中已經(jīng)存在道伟,如果在打包進去,那么包之間就會沖突使碾。

????????????3) ?test: 當依賴的scope為test的時候蜜徽,指的的是在測試范圍有效,在編譯與打包的時候都不會使用這個依賴票摇。

????????????4) ?runtime: 當依賴的scope為runtime的時候拘鞋,在運行的時候才會依賴,在編譯的時候不會依賴矢门。

????????? ? 5)system: system范圍依賴與provided類似盆色,但是你必須顯示的提供一個對于本地系統(tǒng)中jar文件的路徑,需要制定systemPath磁盤路徑颅和,system依賴不推薦使用傅事。


總結(jié):

????????默認引入的jar包? compile (默認范圍缕允,可以不寫峡扩,編譯、測試障本、運行都有效)

????????jsp-api教届、servlet-api??? provided(編譯、測試有效驾霜,運行時無效案训,避免和tomcat下的jar沖突)

????????jdbc驅(qū)動jar包?? runtime(測試、運行有效)

????????junit? test (測試有效 )

4.3 傳遞依賴

4.3.1 什么是傳遞依賴

????????????A依賴B粪糙、B依賴C强霎,將B導入A后會自動導入C,C是A的傳遞依賴蓉冈,如果C依賴D城舞,則D也是A的傳遞依賴轩触。

????????????測試:加入struct2-spring-plugin的依賴如下:

????????<dependency>

? ? ????????????????<groupId>org.apache.struts</groupId>

? ????????????????? <artifactId>struts2-spring-plugin</artifactId>

? ????????????????? <version>2.3.31</version>

? ? ? ?</dependency>

????????最左邊一列為直接依賴,理解為A依賴B的范圍家夺,最頂層一行為傳遞依賴脱柱,理解為B依賴C的范圍,行與列的交叉即為A傳遞依賴C的范圍拉馋。Struts2-spring-plugin依賴struts和spring, 基于傳遞依賴的原理榨为,工程會自動添加struts和spring的依賴。

????????示例:

?????????? 比如A對B有compile依賴煌茴,B對C有runtime依賴随闺,那么根據(jù)變革所示A對C有runtime依賴。

????總結(jié):

?????????? 每個單元格都對應(yīng)列中最弱的那個蔓腐,當P1依賴P2, P2依賴P3 …… 板壮,最終P1傳遞依賴了Pn的時候,P1對Pn的依賴性取決于依賴鏈中最弱的一環(huán)

4.4 依賴版本沖突解決

4.4.4.1 問題

????????當一個項目依賴的構(gòu)件很多時合住,它們相互之間存在依賴绰精,當你需要對依賴版本統(tǒng)一管理時,如果讓maven自動處理可能并不能如你所愿透葛,看示例:

同時加入以下依賴笨使,觀察依賴:

<!-- struts2-spring-plugin依賴spring-beans-3.0.5 -->

????????<dependency>

? ? ????????????????<groupId>org.apache.struts</groupId>

? ? ????????????????<artifactId>struts2-spring-plugin</artifactId>

? ? ????????????????<version>2.3.31</version>

????????</dependency>

<!-- spring-context 依賴spring-beans-4.2.4-->

????????<dependency>

? ? ????????????????<groupId>org.springframework</groupId>

? ? ????????????????<artifactId>spring-context</artifactId>

? ????????????????? <version>4.2.4.RELEASE</version>

????????</dependency>

??????????struts依賴了spring-beans-3.0.5.jar,spring-context依賴了spring-beans-4.2.4.RELEASE.jar, 但是發(fā)現(xiàn)spring-beans-3.0.5加入到了工程中僚害,而我們希望spring-beans-4.2.4加入到工程硫椰。

4.4.4.2 依賴調(diào)節(jié)原則

????????maven自動按照下邊的原則調(diào)解:

?????????第一聲明者優(yōu)先原則,在pom文件中誰先聲明以誰為準萨蚕。

? ? ? ? ? 測試: 將上面的struts-spring-plugin和spring-context順序顛倒靶草,系統(tǒng)將導入spring-beans-4.2.4。但是即使如此還是有3.0.5版本的jar, 如spring-web岳遥。

????????路徑近者優(yōu)先原則

????????比如:A->spring-beans-4.2.4,? A->B->spring-beans-3.0.5奕翔,則spring-beans-4.2.4優(yōu)先。

????????測試: 在工程中的pom中加入spring-beans-4.2.4的依賴浩蓉,根據(jù)路徑近者優(yōu)先原則派继,系統(tǒng)將導入spring-beans-4.2.4:

????????<dependency>

? ? ? ? ???????????? <groupId>org.springframework</groupId>

? ? ? ? ???????????? <artifactId>spring-beans</artifactId>

? ? ? ????????????? <version>4.2.4.RELEASE</version>

? ? ? ?</dependency>

4.4.4.3 排除依賴

????可以通過排除依賴方式輔助依賴調(diào)解:

????比如struts2-spring-plugin中添加spring-beans:

<!-- struts2-spring-plugin依賴spring-beans-3.0.5 -->

? ? ? <dependency>

? ? ? ? ? ???? <groupId>org.apache.struts</groupId>

? ? ? ? ? ???? <artifactId>struts2-spring-plugin</artifactId>

? ? ? ? ? ???? <version>2.3.31</version>

? ? ? ? ? <!-- 排除依賴 -->

? ? ? ? ? ???? <exclusions>

? ? ? ? ? ? ? ????????<exclusion>

? ? ? ? ? ? ? ? ? ????<groupId>org.springframework</groupId>

? ? ? ? ? ? ? ? ? ????<artifactId>spring-beans</artifactId>

? ? ? ? ? ? ????? </exclusion>

? ? ? ? ? </exclusions>

? ? ? </dependency>

???但是這樣存在一個問題就是,如果某一個依賴里面過多捻艳,排除起來非常麻煩驾窟,且也不太確定其依賴了什么。

4.4.4 鎖定版本(建議使用)

????????面對眾多的依賴认轨,有一種方法不用考慮依賴路徑绅络、聲明優(yōu)先等因素可以采用直接鎖定版本的方法確定依賴構(gòu)件的版本,此方法在企業(yè)開發(fā)中常用:

<!-- 鎖定版本 spring 4.2.4-->

<dependencyManagement>

? ? ? <dependencies>

? ? ? ? ? <dependency>

? ? ? ? ? ? ? ???????? <groupId>org.springframework</groupId>

? ? ? ? ? ? ? ???????? <artifactId>spring-beans</artifactId>

? ? ? ? ? ? ? ???????? <version>4.2.4.RELEASE</version>

? ? ? ? ? </dependency>

? ? ? ? ? <dependency>

? ? ? ? ? ? ? ???????? <groupId>org.springframework</groupId>

? ? ? ? ? ? ? ???????? <artifactId>spring-core</artifactId>

? ? ? ? ? ? ? ???????? <version>4.2.4.RELEASE</version>

? ? ? ? ? </dependency>

? ? ? ? ? <dependency>

? ? ? ? ? ? ? ???????? <groupId>org.springframework</groupId>

? ? ? ? ? ? ? ???????? <artifactId>spring-web</artifactId>

? ? ? ? ? ? ? ???????? <version>4.2.4.RELEASE</version>

? ? ? ? ? </dependency>

? ? ? </dependencies>

</dependencyManagement>?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市恩急,隨后出現(xiàn)的幾起案子节视,更是在濱河造成了極大的恐慌,老刑警劉巖假栓,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寻行,死亡現(xiàn)場離奇詭異,居然都是意外死亡匾荆,警方通過查閱死者的電腦和手機拌蜘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牙丽,“玉大人简卧,你說我怎么就攤上這事】韭” “怎么了举娩?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長构罗。 經(jīng)常有香客問我铜涉,道長,這世上最難降的妖魔是什么遂唧? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任芙代,我火速辦了婚禮,結(jié)果婚禮上盖彭,老公的妹妹穿的比我還像新娘纹烹。我一直安慰自己,他們只是感情好召边,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布铺呵。 她就那樣靜靜地躺著,像睡著了一般隧熙。 火紅的嫁衣襯著肌膚如雪片挂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天贱鼻,我揣著相機與錄音宴卖,去河邊找鬼滋将。 笑死邻悬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的随闽。 我是一名探鬼主播父丰,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛾扇?” 一聲冷哼從身側(cè)響起攘烛,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镀首,沒想到半個月后坟漱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡更哄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年芋齿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片成翩。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡觅捆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出麻敌,到底是詐尸還是另有隱情栅炒,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布术羔,位于F島的核電站赢赊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏级历。R本人自食惡果不足惜域携,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鱼喉。 院中可真熱鬧秀鞭,春花似錦、人聲如沸扛禽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽编曼。三九已至豆巨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掐场,已是汗流浹背往扔。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留熊户,地道東北人萍膛。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像嚷堡,于是被迫代替她去往敵國和親蝗罗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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