1 maven基礎(chǔ)知識回顧
1.1 maven介紹
maven 是一個項目管理工具题造,主要作用是在項目開發(fā)階段對Java項目進(jìn)行依賴管理和項目構(gòu)建游添。
依賴管理:就是對jar包的管理。通過導(dǎo)入maven坐標(biāo)二庵,就相當(dāng)于將倉庫中的jar包導(dǎo)入了當(dāng)前項目中纠拔。
項目構(gòu)建:通過maven的一個命令就可以完成項目從清理、編譯澜汤、測試蚜迅、報告舵匾、打包,部署整個過程谁不。
1.2 maven的倉庫類型
1.本地倉庫
2.遠(yuǎn)程倉庫
①maven中央倉庫(地址:http://repo2.maven.org/maven2/)
②maven私服(公司局域網(wǎng)內(nèi)的倉庫坐梯,需要自己搭建)
③其他公共遠(yuǎn)程倉庫(例如apache提供的遠(yuǎn)程倉庫,地址:
http://repo.maven.apache.org/maven2/)
本地倉庫---》maven私服---》maven中央倉庫
1.3 maven常用命令
clean: 清理
compile:編譯
test: 測試
package:打包
install: 安裝
1.4 maven坐標(biāo)書寫規(guī)范
2 maven的依賴傳遞
2.1 什么是依賴傳遞
在maven中刹帕,依賴是可以傳遞的吵血,假設(shè)存在三個項目,分別是項目A偷溺,項目B以及項目C蹋辅。假設(shè)C依賴B,B依賴A挫掏,那么我們可以根據(jù)maven項目依賴的特征不難推出項目C也依賴A侦另。
通過上面的圖可以看到,我們的web項目直接依賴了spring-webmvc尉共,而spring-webmvc依賴了sping-aop褒傅、spring-beans等。最終的結(jié)果就是在我們的web項目中間接依賴了spring-aop袄友、spring-beans等殿托。
依賴沖突
由于依賴傳遞現(xiàn)象的存在, spring-webmvc 依賴 spirng-beans-5.1.5剧蚣,spring-aop 依賴 spring-beans-5.1.6支竹,但是發(fā)現(xiàn) spirng-beans-5.1.5 加入到了工程中旋廷,而我們希望 spring-beans-5.1.6 加入工程。這就造成了依賴沖突
2.2 如何解決依賴沖突
1.使用maven提供的依賴調(diào)解原則
- 第一聲明者優(yōu)先原則
- 路徑近者優(yōu)先原則
2.排除依賴
3.鎖定版本
2.3 依賴調(diào)節(jié)原則——第一聲明者優(yōu)先原則
在 pom 文件中定義依賴唾戚,以先聲明的依賴為準(zhǔn)柳洋。其實就是根據(jù)坐標(biāo)導(dǎo)入的順序來確定最終使用哪個傳遞過來的依賴。
結(jié)論:通過上圖可以看到叹坦,spring-aop和spring-webmvc都傳遞過來了spring-beans熊镣,但是因為
spring-aop在前面,所以最終使用的spring-beans是由spring-aop傳遞過來的募书,而spring-webmvc傳遞
過來的spring-beans則被忽略了绪囱。
2.4 依賴調(diào)節(jié)原則——路徑近者優(yōu)先原則
2.5 排除依賴
可以使用exclusions標(biāo)簽將傳遞過來的依賴排除出去。
2.6 版本鎖定
采用直接鎖定版本的方法確定依賴jar包的版本莹捡,版本鎖定后則不考慮依賴的聲明順序或依賴的路徑鬼吵,以
鎖定的版本為準(zhǔn)添加到工程中,此方法在企業(yè)開發(fā)中經(jīng)常使用篮赢。
版本鎖定的使用方式:
第一步:在dependencyManagement標(biāo)簽中鎖定依賴的版本
第二步:在dependencies標(biāo)簽中聲明需要導(dǎo)入的maven坐標(biāo)
①在dependencyManagement標(biāo)簽中鎖定依賴的版本
②在dependencies標(biāo)簽中聲明需要導(dǎo)入的maven坐標(biāo)
2.7 properties標(biāo)簽的使用
<properties>
<spring.version>5.1.5.RELEASE</spring.version>
<springmvc.version>5.1.5.RELEASE</springmvc.version>
<mybatis.version>3.5.1</mybatis.version>
</properties>
<!--鎖定jar版本-->
<dependencyManagement>
<dependencies>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- springMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springmvc.version}</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
3 maven聚合工程
概念
在現(xiàn)實生活中齿椅,汽車廠家進(jìn)行汽車生產(chǎn)時,由于整個生產(chǎn)過程非常復(fù)雜和繁瑣启泣,工作量非常大涣脚,所以廠家都會將整個汽車的部件分開生產(chǎn),最終再將生產(chǎn)好的部件進(jìn)行組裝寥茫,形成一臺完整的汽車
3.1 分模塊構(gòu)建maven工程分析
在企業(yè)項目開發(fā)中遣蚀,由于項目規(guī)模大,業(yè)務(wù)復(fù)雜纱耻,參與的人員比較多芭梯,一般會通過合理的模塊拆分將一個大型的項目拆分為N多個小模塊,分別進(jìn)行開發(fā)弄喘。而且拆分出的模塊可以非常容易的被其他模塊復(fù)用
常見的拆分方式有兩種:
第一種:按照業(yè)務(wù)模塊進(jìn)行拆分玖喘,每個模塊拆分成一個maven工程,例如將一個項目分為用戶模塊蘑志,訂單模塊累奈,購物車模塊等,每個模塊對應(yīng)就是一個maven工程
第二種:按照層進(jìn)行拆分卖漫,例如持久層费尽、業(yè)務(wù)層、表現(xiàn)層等羊始,每個層對應(yīng)就是一個maven工程
不管上面那種拆分方式旱幼,通常都會提供一個父工程,將一些公共的代碼和配置提取到父工程中進(jìn)行統(tǒng)一管理和配置突委。
3.2 maven工程的繼承
在Java語言中柏卤,類之間是可以繼承的冬三,通過繼承,子類就可以引用父類中非private的屬性和方法缘缚。同樣勾笆,在maven工程之間也可以繼承,子工程繼承父工程后桥滨,就可以使用在父工程中引入的依賴窝爪。繼承的目的是為了消除重復(fù)代碼。
3.3 maven工程的聚合
在maven工程的pom.xml文件中可以使用標(biāo)簽將其他maven工程聚合到一起齐媒,聚合的目的是為了進(jìn)行
統(tǒng)一操作蒲每。
例如拆分后的maven工程有多個,如果要進(jìn)行打包喻括,就需要針對每個工程分別執(zhí)行打包命令邀杏,操作起來
非常繁瑣。這時就可以使用標(biāo)簽將這些工程統(tǒng)一聚合到maven父工程中唬血,需要打包的時候望蜡,只需要在此
工程中執(zhí)行一次打包命令,其下被聚合的工程就都會被打包了拷恨。