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>?