Maven版本控制
傳遞性依賴是Maven2.0的新特性。假設(shè)你的項(xiàng)目依賴于一個(gè)庫,而這個(gè)庫又依賴于其他庫。你不必自己去找出所有這些依賴,你只需要加上你直接依賴的庫,Maven會(huì)隱式的把這些庫間接依賴的庫也加入到你的項(xiàng)目中。這個(gè)特性是靠解析從遠(yuǎn)程倉庫中獲取的依賴庫的項(xiàng)目文件實(shí)現(xiàn)的。一般的,這些項(xiàng)目的所有依賴都會(huì)加入到項(xiàng)目中,或者從父項(xiàng)目繼承,或者通過傳遞性依賴。
如果A依賴了B,那么C依賴A時(shí)會(huì)自動(dòng)把A和B都導(dǎo)入進(jìn)來。

創(chuàng)建A項(xiàng)目后,選擇IDEA最右側(cè)Maven面板lifecycle,雙擊install后就會(huì)把項(xiàng)目安裝到本地倉庫中,其他項(xiàng)目就可以通過坐標(biāo)引用此項(xiàng)目。
【1】第一原則:最短路徑優(yōu)先原則
“最短路徑優(yōu)先”意味著項(xiàng)目依賴關(guān)系樹中路徑最短的版本會(huì)被使用。
例如,假設(shè)A、B、C之間的依賴關(guān)系是A->B->C->D(2.0) ?和A->E->(D1.0),那么D(1.0)會(huì)被使用,因?yàn)锳通過E到D的路徑更短。
【2】第二原則:最先聲明原則
依賴路徑長度是一樣的的時(shí)候,第一原則不能解決所有問題,比如這樣的依賴關(guān)系:A–>B–>Y(1.0),A–>C–>Y(2.0),Y(1.0)和Y(2.0)的依賴路徑長度是一樣的,都為2。那么到底誰會(huì)被解析使用呢?在maven2.0.8及之前的版本中,這是不確定的,但是maven2.0.9開始,為了盡可能避免構(gòu)建的不確定性,maven定義了依賴調(diào)解的第二原則:第一聲明者優(yōu)先。在依賴路徑長度相等的前提下,在POM中依賴聲明的順序決定了誰會(huì)被解析使用。順序最靠前的那個(gè)依賴優(yōu)勝。
exclusions: 用來排除傳遞性依賴 其中可配置多個(gè)exclusion標(biāo)簽,每個(gè)exclusion標(biāo)簽里面對(duì)應(yīng)的有g(shù)roupId, artifactId, version三項(xiàng)基本元素。注意:不用寫版本號(hào) ? ? 比如:A--->B--->C (Mybatis.jar) 排除C中的Mybatis.jar
img繼承關(guān)系:
如果A工程繼承B工程,則代表A工程默認(rèn)依賴B工程依賴的所有資源,且可以應(yīng)用B工程中定義的所有資源信息。
被繼承的工程(B工程)只能是POM工程。
在父項(xiàng)目中放在<dependencyManagement>中的內(nèi)容時(shí)不被子項(xiàng)目繼承,不可以直接使用
放在<dependencyManagement>中的內(nèi)容主要目的是進(jìn)行版本管理。里面的內(nèi)容在子項(xiàng)目中依賴時(shí)坐標(biāo)只需要填寫
<group id>和<artifact id>即可。(注意:如果子項(xiàng)目不希望使用父項(xiàng)目的版本,可以明確配置version)。

當(dāng)我們開發(fā)的工程擁有2個(gè)以上模塊的時(shí)候,每個(gè)模塊都是一個(gè)獨(dú)立的功能集合。比如某大學(xué)系統(tǒng)中擁有搜索平臺(tái),學(xué)習(xí)平臺(tái),考試平臺(tái)等。開發(fā)的時(shí)候每個(gè)平臺(tái)都可以獨(dú)立編譯,測(cè)試,運(yùn)行。這個(gè)時(shí)候我們就需要一個(gè)聚合工程。
在創(chuàng)建聚合工程的過程中,總的工程必須是一個(gè)POM工程(Maven Project)(聚合項(xiàng)目必須是一個(gè)pom類型的項(xiàng)目,jar項(xiàng)目war項(xiàng)目是沒有辦法做聚合工程的),各子模塊可以是任意類型模塊(Maven Module)。
前提:繼承。
聚合包含了繼承的特性。
聚合時(shí)多個(gè)項(xiàng)目的本質(zhì)還是一個(gè)項(xiàng)目。這些項(xiàng)目被一個(gè)大的父項(xiàng)目包含。且這時(shí)父項(xiàng)目類型為pom類型。同時(shí)在父項(xiàng)目的pom.xml中出現(xiàn)表示包含的所有子模塊。
總項(xiàng)目:一般總項(xiàng)目:POM項(xiàng)目


常見插件
- 通過編譯器插件,我們可以配置使用的JDK或者說編譯器的版本
- settings.xml文件中配置全局編譯器插件:


Maven在打包時(shí)默認(rèn)只將src/main/resources里的配置文件拷貝到項(xiàng)目中并做打包處理,而非resource目錄下的配置文件在打包時(shí)不會(huì)添加到項(xiàng)目中。
我們的配置文件,一般都放在:src/main/resources
然后打包后配置文件就會(huì)在target的classes下面放著:


現(xiàn)在學(xué)習(xí)一個(gè)新的方式,不再依賴外部的tomcat,maven提供了tomcat插件,我們可以配置來使用。
創(chuàng)建web項(xiàng)目:war項(xiàng)目:
maven項(xiàng)目pom.xml中parent標(biāo)簽的使用
使用maven是為了更好的幫項(xiàng)目管理包依賴,maven的核心就是pom.xml。當(dāng)我們需要引入一個(gè)jar包時(shí),在pom文件中加上就可以從倉庫中依賴到相應(yīng)的jar包。
-
現(xiàn)在有這樣一個(gè)場(chǎng)景,有兩個(gè)web項(xiàng)目A、B,一個(gè)java項(xiàng)目C,它們都需要用到同一個(gè)jar包:common.jar。如果分別在三個(gè)項(xiàng)目的pom文件中定義各自對(duì)common.jar的依賴,那么當(dāng)common.jar的版本發(fā)生變化時(shí),三個(gè)項(xiàng)目的pom文件都要改,項(xiàng)目越多要改的地方就越多,很麻煩。這時(shí)候就需要用到parent標(biāo)簽, 我們創(chuàng)建一個(gè)parent項(xiàng)目,打包類型為pom,parent項(xiàng)目中不存放任何代碼,只是管理多個(gè)項(xiàng)目之間公共的依賴。在parent項(xiàng)目的pom文件中定義對(duì)common.jar的依賴,ABC三個(gè)子項(xiàng)目中只需要定義,parent標(biāo)簽中寫上parent項(xiàng)目的pom坐標(biāo)就可以引用到common.jar了。
-
我們?cè)谇袚Q一個(gè)場(chǎng)景,有一個(gè)springmvc.jar,只有AB兩個(gè)web項(xiàng)目需要,C項(xiàng)目是java項(xiàng)目不需要,那么又要怎么去依賴。如果AB中分別定義對(duì)springmvc.jar的依賴,當(dāng)springmvc.jar版本變化時(shí)修改起來又會(huì)很麻煩。解決辦法是在parent項(xiàng)目的pom文件中使用將springmvc.jar管理起來,如果有哪個(gè)子項(xiàng)目要用,那么子項(xiàng)目在自己的pom文件中使用
標(biāo)簽中寫上springmvc.jar的坐標(biāo),不需要寫版本號(hào),可以依賴到這個(gè)jar包了。這樣springmvc.jar的版本發(fā)生變化時(shí)只需要修改parent中的版本就可以了。
springboot為什么引入一些依賴時(shí)不需要指定版本
-
其實(shí)在Spring Boot 項(xiàng)目下的pom.xml文件中通常都會(huì)有一個(gè)標(biāo)簽,用來指定繼承的父pom
?<parent>
????????<groupId>org.springframework.boot</groupId>
????????<artifactId>spring-boot-starter-parent</artifactId>
????????<version>1.5.10.RELEASE</version>
????????<relativePath/>
????</parent>其實(shí)在Spring Boot 項(xiàng)目下的pom.xml文件中通常都會(huì)有一個(gè)標(biāo)簽,用來指定繼承的父pom,如下::
?<parent>
????????<groupId>org.springframework.boot</groupId>
????????<artifactId>spring-boot-dependencies</artifactId>
????????<version>1.5.10.RELEASE</version>
????????<relativePath>../../spring-boot-dependencies</relativePath>
????</parent>點(diǎn)進(jìn)去后會(huì)發(fā)現(xiàn)spring-boot-starter-parent也繼承自一個(gè)pom,如下:
?<parent>
????????<groupId>org.springframework.boot</groupId>
????????<artifactId>spring-boot-dependencies</artifactId>
????????<version>1.5.10.RELEASE</version>
????????<relativePath>../../spring-boot-dependencies</relativePath>
????</parent>再點(diǎn)進(jìn)去就可以看到結(jié)果了,頂級(jí)的pom文件的坐標(biāo)如下,通過標(biāo)簽我們應(yīng)該知道這個(gè)pom文件時(shí)用來管理依賴版本號(hào)的。
??<groupId>org.springframework.boot</groupId>
????<artifactId>spring-boot-dependencies</artifactId>
????<version>1.5.10.RELEASE</version>
????<packaging>pom</packaging>在這個(gè)pom.xml中定義了很多的標(biāo)簽用來管理引入依賴和插件的版本。 在引入依賴的時(shí)候,即使你不指定依賴的版本,Spring Boot 也會(huì)通過Maven 的繼承關(guān)系,引入依賴的版本,從而完成版本的統(tǒng)一。 另外不是所有依賴都在parent中指定了版本,對(duì)于沒有指定版本的依賴依然需要手動(dòng)指定版本否則會(huì)出現(xiàn)No version of dendency的異常 當(dāng)然你也可以不使用Maven繼承的依賴版本,只需要在引入依賴的時(shí)候指定具體的依賴版本即可.

maven的pom.xml中repositories的作用
在pom.xml中repositories標(biāo)簽的作用是用來配置maven項(xiàng)目的遠(yuǎn)程倉庫。示例如下:
<repositories>
<repository>
<id>遠(yuǎn)程倉庫唯一標(biāo)識(shí)符</id>
<url>遠(yuǎn)程倉庫的url</url>
</repository>
</repositories>
