maven認(rèn)識(shí)

該篇文章篇幅很長(zhǎng)膘侮,大概的思路如下

          maven的介紹清女,初步認(rèn)識(shí)阳惹,獲取jar包的三個(gè)關(guān)鍵屬性 --> 介紹倉(cāng)庫(kù)(獲取的jar包從何而來(lái))-->用命令行管理maven項(xiàng)目(創(chuàng)建maven項(xiàng)目) --> 用myeclipse創(chuàng)建maven項(xiàng)目 -->詳細(xì)介紹pom.xml中的依賴(lài)關(guān)系(坐標(biāo)獲取谍失、定位jar包的各種屬性講解。


一莹汤、簡(jiǎn)單的小問(wèn)題快鱼?

    解釋之前,提1個(gè)小問(wèn)題纲岭。

      1.1抹竹、假如你正在Eclipse下開(kāi)發(fā)兩個(gè)Java項(xiàng)目,姑且把它們稱(chēng)為A荒勇、B柒莉,其中A項(xiàng)目中的一些功能依賴(lài)于B項(xiàng)目中的某些類(lèi),那么如何維系這種依賴(lài)關(guān)系的呢沽翔?

        很簡(jiǎn)單兢孝,這不就是跟我們之前寫(xiě)程序時(shí)一樣嗎窿凤,需要用哪個(gè)項(xiàng)目中的哪些類(lèi),也就是用別人寫(xiě)好了的功能代碼跨蟹,導(dǎo)入jar包即可雳殊。所以這里也如此,可以將B項(xiàng)目打成jar包窗轩,然后在A項(xiàng)目的Library下導(dǎo)入B的jar文件夯秃,這樣,A項(xiàng)目就可以調(diào)用B項(xiàng)目中的某些類(lèi)了痢艺。

        這樣做幾種缺陷

          如果在開(kāi)發(fā)過(guò)程中仓洼,發(fā)現(xiàn)B中的bug,則必須將B項(xiàng)目修改好堤舒,并重新將B打包并對(duì)A項(xiàng)目進(jìn)行重編譯操作

          在完成A項(xiàng)目的開(kāi)發(fā)后色建,為了保證A的正常運(yùn)行,就需要依賴(lài)B(就像在使用某個(gè)jar包時(shí)必須依賴(lài)另外一個(gè)jar一樣)舌缤,兩種解決方案箕戳,第一種,選擇將B打包入A中国撵,第二種陵吸,將B也發(fā)布出去,等別人需要用A時(shí)介牙,告訴開(kāi)發(fā)者壮虫,想要用A就必須在導(dǎo)入Bjar包。兩個(gè)都很麻煩环础,前者可能造成資源的浪費(fèi)(比如旨指,開(kāi)發(fā)者可能正在開(kāi)發(fā)依賴(lài)B的其它項(xiàng)目,B已經(jīng)存儲(chǔ)到本地了喳整,在導(dǎo)入A的jar包的話(huà),就有了兩個(gè)B的jar)裸扶,后者是我們常遇到的框都,找各種jar包,非常麻煩(有了maven就不一樣了)


      1.2呵晨、我們開(kāi)發(fā)一個(gè)項(xiàng)目魏保,或者做一個(gè)小demo,比如用SSH框架摸屠,那么我們就必須將SSH框架所用的幾十個(gè)依賴(lài)的jar包依次找出來(lái)并手動(dòng)導(dǎo)入谓罗,超級(jí)繁瑣。

上面兩個(gè)問(wèn)題的描述季二,其實(shí)都屬于項(xiàng)目與項(xiàng)目之間依賴(lài)的問(wèn)題[A項(xiàng)目使用SSH的所有jar檩咱,就說(shuō)A項(xiàng)目依賴(lài)SSH]揭措,人為手動(dòng)的去解決,很繁瑣刻蚯,也不方便绊含,所以使用maven來(lái)幫我們管理


二、maven到底是什么炊汹?

Maven是基于項(xiàng)目對(duì)象模型(POM project object model)躬充,可以通過(guò)一小段描述信息(配置)來(lái)管理項(xiàng)目的構(gòu)建,報(bào)告和文檔的軟件項(xiàng)目管理工具[百度百科]

這種又是大白話(huà)讨便,如果沒(méi)明白maven是什么充甚,那么上面這句話(huà)跟沒(méi)說(shuō)一樣,我自己覺(jué)得霸褒,Maven的核心功能便是合理敘述項(xiàng)目間的依賴(lài)關(guān)系伴找,通俗點(diǎn)講,就是通過(guò)pom.xml文件的配置獲取jar包傲霸,而不用手動(dòng)去添加jar包疆瑰,而這里pom.xml文件對(duì)于學(xué)了一點(diǎn)maven的人來(lái)說(shuō),就有些熟悉了昙啄,怎么通過(guò)pom.xml的配置就可以獲取到j(luò)ar包呢穆役?pom.xml配置文件從何而來(lái)?等等類(lèi)似問(wèn)題我們需要搞清楚梳凛,如果需要使用pom.xml來(lái)獲取jar包耿币,那么首先該項(xiàng)目就必須為maven項(xiàng)目,maven項(xiàng)目可以這樣去想韧拒,就是在java項(xiàng)目和web項(xiàng)目的上面包裹了一層maven淹接,本質(zhì)上java項(xiàng)目還是java項(xiàng)目,web項(xiàng)目還是web項(xiàng)目叛溢,但是包裹了maven之后塑悼,就可以使用maven提供的一些功能了(通過(guò)pom.xml添加jar包)蟹肘。

    所以澈魄,根據(jù)上一段的描述,我們最終的目的就是學(xué)會(huì)如何在pom.xml中配置獲取到我們想要的jar包晕城,在此之前我們就必須了解如何創(chuàng)建maven項(xiàng)目烹植,maven項(xiàng)目的結(jié)構(gòu)是怎樣斑鸦,與普通java,web項(xiàng)目的區(qū)別在哪里,還有如何配置pom.xml獲取到對(duì)應(yīng)的jar包等等草雕,這里提前了解一下我們?nèi)绾瓮ㄟ^(guò)pom.xml文件獲取到想要的jar的巷屿,具體后面會(huì)詳細(xì)講解該配置文件。

pom.xml獲取junit的jar包的編寫(xiě)墩虹。

    為什么通過(guò)groupId嘱巾、artifactId憨琳、version三個(gè)屬性就能定位一個(gè)jar包?

        加入上面的pom.xml文件屬于A項(xiàng)目浓冒,那么A項(xiàng)目肯定是一個(gè)maven項(xiàng)目栽渴,通過(guò)上面這三個(gè)屬性能夠找到j(luò)unit對(duì)應(yīng)版本的jar包,那么junit項(xiàng)目肯定也是一個(gè)maven項(xiàng)目稳懒,junit的maven項(xiàng)目中的pom.xml文件就會(huì)有三個(gè)標(biāo)識(shí)符闲擦,比如像下圖這樣,然后別的maven項(xiàng)目就能通過(guò)這三個(gè)屬性來(lái)找到j(luò)unit項(xiàng)目的jar包了场梆。所以墅冷,在每個(gè)創(chuàng)建的maven項(xiàng)目時(shí)都會(huì)要求寫(xiě)上這三個(gè)屬性值的。



三或油、maven的安裝

這一步maven環(huán)境的配置寞忿,我覺(jué)得有必要安裝一下,目的為了使用命令行創(chuàng)建maven項(xiàng)目顶岸,和使用命令行操作maven項(xiàng)目腔彰。這里不細(xì)講,給出鏈接辖佣,跟安裝jdk環(huán)境類(lèi)似霹抛,maven的安裝教程和配置

?還有注意,我以下用的是maven3.0.4版本(比較低的)卷谈,你們可以下載最新的版本杯拐,最好是使用jdk1.7.

四、倉(cāng)庫(kù)的概念

    通過(guò)pom.xml中的配置世蔗,就能夠獲取到想要的jar包(還沒(méi)講解如何配置先需要了解一下倉(cāng)庫(kù)的概念)端逼,但是這些jar是在哪里呢?就是我們從哪里獲取到的這些jar包污淋?答案就是倉(cāng)庫(kù)顶滩。

    倉(cāng)庫(kù)分為:本地倉(cāng)庫(kù)、第三方倉(cāng)庫(kù)(私服)寸爆、中央倉(cāng)庫(kù)

      4.1诲祸、本地倉(cāng)庫(kù)

          Maven會(huì)將工程中依賴(lài)的構(gòu)件(Jar包)從遠(yuǎn)程下載到本機(jī)一個(gè)目錄下管理,每個(gè)電腦默認(rèn)的倉(cāng)庫(kù)是在 $user.home/.m2/repository下

              例如我的就在:C:\Users\Administrator\.m2\repository

          一般我們會(huì)修改本地倉(cāng)庫(kù)位置而昨,自己創(chuàng)建一個(gè)文件夾,在從網(wǎng)上下載一個(gè)擁有相對(duì)完整的所有jar包的結(jié)合找田,都丟到本地倉(cāng)庫(kù)中歌憨,然后每次寫(xiě)項(xiàng)目,直接從本地倉(cāng)庫(kù)里拿就行了

這里面有很多各種各樣我們需要的jar包墩衙。

          修改本地庫(kù)位置:在$MAVEN_HOME/conf/setting.xml文件中修改务嫡,

          D:\java\maven\repository:就是我們自己創(chuàng)建的本地倉(cāng)庫(kù)甲抖,將網(wǎng)上下載的所有jar包,都丟到該目錄下心铃,我們就可以直接通過(guò)maven的pom.xml文件直接拿准谚。


      4.2、第三方倉(cāng)庫(kù)

          第三方倉(cāng)庫(kù)去扣,又稱(chēng)為內(nèi)部中心倉(cāng)庫(kù)柱衔,也稱(chēng)為私服

          私服:一般是由公司自己設(shè)立的,只為本公司內(nèi)部共享使用愉棱。它既可以作為公司內(nèi)部構(gòu)件協(xié)作和存檔唆铐,也可作為公用類(lèi)庫(kù)鏡像緩存,減少在外部訪問(wèn)和下載的頻率奔滑。(使用私服為了減少對(duì)中央倉(cāng)庫(kù)的訪問(wèn)

          私服可以使用的是局域網(wǎng)艾岂,中央倉(cāng)庫(kù)必須使用外網(wǎng)

          也就是一般公司都會(huì)創(chuàng)建這種第三方倉(cāng)庫(kù),保證項(xiàng)目開(kāi)發(fā)時(shí)朋其,項(xiàng)目所需用的jar都從該倉(cāng)庫(kù)中拿王浴,每個(gè)人的版本就都一樣。

注意:連接私服梅猿,需要單獨(dú)配置氓辣。如果沒(méi)有配置私服,默認(rèn)不使用


      4.3粒没、中央倉(cāng)庫(kù)

          Maven內(nèi)置了遠(yuǎn)程公用倉(cāng)庫(kù):http://repo1.maven.org/maven2

          這個(gè)公共倉(cāng)庫(kù)是由Maven自己維護(hù)筛婉,里面有大量的常用類(lèi)庫(kù),并包含了世界上大部分流行的開(kāi)源項(xiàng)目構(gòu)件癞松。目前是以java為主

工程依賴(lài)的jar包如果本地倉(cāng)庫(kù)沒(méi)有爽撒,默認(rèn)從中央倉(cāng)庫(kù)下載


      總結(jié):獲取jar包的過(guò)程


五、使用命令行管理maven項(xiàng)目

5.1响蓉、創(chuàng)建maven java項(xiàng)目

          自己創(chuàng)建一個(gè)文件夾硕勿,在該文件夾下按shift+右擊,點(diǎn)開(kāi)使用命令行模式枫甲,這樣創(chuàng)建的maven[java]項(xiàng)目就在該文件夾下了源武。

          命令:mvn archetype:create -DgroupId=com.wuhao.maven.quickstart -DartifactId=simple -DarchetypeArtifactId=maven-archetype-quickstart

            mvn:核心命令

archetype:create:創(chuàng)建項(xiàng)目,現(xiàn)在maven高一點(diǎn)的版本都棄用了create命令而使用generate命令了想幻。

-DgroupId=com.wuhao.maven.quickstart?:創(chuàng)建該maven項(xiàng)目時(shí)的groupId是什么粱栖,該作用在上面已經(jīng)解釋了。一般使用包名的寫(xiě)法脏毯。因?yàn)榘怯霉镜挠蛎姆磳?xiě)闹究,獨(dú)一無(wú)二

-DartifactId=simple:創(chuàng)建該maven項(xiàng)目時(shí)的artifactId是什么,就是項(xiàng)目名稱(chēng)

-DarchetypeArtifactId=maven-archetype-quickstart:表示創(chuàng)建的是[maven]java項(xiàng)目

?          運(yùn)行的前提:需要聯(lián)網(wǎng)食店,必須上網(wǎng)下載一個(gè)小文件

          運(yùn)行成功后

          在D:\java\maven\demo下就會(huì)生成一個(gè)simple的文件渣淤,該文件就是我們的maven java項(xiàng)目

5.2赏寇、maven java項(xiàng)目結(jié)構(gòu)

simple

---pom.xml    核心配置,項(xiàng)目根下

---src

---main

---java    java源碼目錄

---resources ? java配置文件目錄

---test

---java    測(cè)試源碼目錄

---resources ? 測(cè)試配置目錄

          圖中有一個(gè)target目錄价认,是因?yàn)閷⒃搄ava項(xiàng)目進(jìn)行了編譯嗅定,src/main/java下的源代碼就會(huì)編譯成.class文件放入target目錄中,target就是輸出目錄用踩。

5.3渠退、創(chuàng)建 maven web 項(xiàng)目

命令:mvn archetype:create -DgroupId=com.wuhao.maven.quickstart?-DartifactId=myWebApp?-DarchetypeArtifactId=maven-archetype-webapp?-Dversion=0.0.1-snapshot

其他都差不多,創(chuàng)建maven web項(xiàng)目的話(huà) -DarchetypeArtifactId=maven-archetype-webapp?比創(chuàng)建java項(xiàng)目多了一個(gè) -Dversion=0.01-snapshot捶箱, 在創(chuàng)建java項(xiàng)目的時(shí)候也可以加上這個(gè)智什,如果不寫(xiě),會(huì)默認(rèn)幫我們加上1.0-snapshot丁屎。

           在D:\java\maven\demo下就會(huì)生成一個(gè)myWebApp的文件

5.4荠锭、maven web項(xiàng)目結(jié)構(gòu)

pom.xml ?? ??? ??? ??? ?核心配置

src/main/java?? ??? ??? ??? ?java源碼

src/main/resources?? ??? ??? ?java配置

src/main/webapp?? ??? ??? ?myeclipse web項(xiàng)目中 WebRoot目錄

|-- WEB-INF

|-- web.xml

src/test?? ??? ??? ??? ??? ?測(cè)試

target?? ??? ??? ??? ??? ?輸出目錄


5.5、命令操作maven java或web項(xiàng)目

          編譯:mvn compile  --src/main/java目錄java源碼編譯生成class (target目錄下)

          測(cè)試:mvn test    --src/test/java 目錄編譯

          清理:mvn clean    --刪除target目錄晨川,也就是將class文件等刪除

          打包:mvn package  --生成壓縮文件:java項(xiàng)目#jar包证九;web項(xiàng)目#war包,也是放在target目錄下

          安裝:mvn install   --將壓縮文件(jar或者war)上傳到本地倉(cāng)庫(kù)

          部署|發(fā)布:mvn deploy  --將壓縮文件上傳私服

5.6共虑、例子:使用命令操作maven java項(xiàng)目

          注意:使用命令時(shí)愧怜,必須在maven java項(xiàng)目的根目錄下,及可以看到pom.xml

          描述:將maven java項(xiàng)目打包上傳到本地倉(cāng)庫(kù)供別人調(diào)用

            使用 mvn install

            在本地倉(cāng)庫(kù)中查看是否有該項(xiàng)目

D:\java\maven\repository\com\wuhao\maven\quickstart\simple\1.0-SNAPSHOT

            通過(guò)在本地倉(cāng)庫(kù)中的目錄可以發(fā)現(xiàn)為什么通過(guò)groupId妈拌、artifactId拥坛、version可以定位到倉(cāng)庫(kù)中得jar包,也可以知道為什么groupId要使用公司域名的反寫(xiě)(因?yàn)檫@樣唯一尘分,不會(huì)與別的項(xiàng)目重名導(dǎo)致查找到的內(nèi)容不精確)


5.7猜惋、maven項(xiàng)目的完整生命周期,當(dāng)執(zhí)行生命周期后面命令時(shí)培愁,前面步驟的命令自動(dòng)執(zhí)行

          紅色標(biāo)記字體的意思就是當(dāng)我們直接使用mvn install命令對(duì)項(xiàng)目進(jìn)行上傳至本地倉(cāng)庫(kù)時(shí)著摔,那么前面所有的步驟將會(huì)自動(dòng)執(zhí)行,比如源代碼的編譯定续,打包等等谍咆。


5.8、其他命令

          maven java或web項(xiàng)目轉(zhuǎn)換Eclipse工程

             mvn eclipse:eclipse

             mvn eclipse:clean  清楚eclipse設(shè)置信息私股,又從eclipse工程轉(zhuǎn)換為maven原生項(xiàng)目了

          ...轉(zhuǎn)換IDEA工程

             mvn idea:idea

             mvn idea:clean  同上


六摹察、使用Myeclipse創(chuàng)建maven自定義項(xiàng)目

    使用myeclpse創(chuàng)建項(xiàng)目前,需要在myeclipse中配置maven的一些信息

      比如:配置本地倉(cāng)庫(kù)倡鲸、安裝自定義maven(myeclipse中高版本自帶了maven)等港粱,這里省略。

6.1、java項(xiàng)目

          1查坪、選擇maven project,如果右鍵新建沒(méi)有宁炫,通過(guò)other獲得

          2偿曙、創(chuàng)建一個(gè)簡(jiǎn)單項(xiàng)目(跳過(guò)骨架選擇)

          3、設(shè)置項(xiàng)目參數(shù)羔巢,創(chuàng)建java項(xiàng)目

          4望忆、創(chuàng)建java項(xiàng)目結(jié)果

6.2、創(chuàng)建maven web項(xiàng)目

          1竿秆、同上

          2启摄、同上

          3、設(shè)置項(xiàng)目參數(shù)幽钢,其他一樣歉备,選擇打包方式不一樣。

          4匪燕、創(chuàng)建web項(xiàng)目結(jié)果

          5蕾羊、可能報(bào)錯(cuò)1:pom.xml報(bào)錯(cuò)

             結(jié)果如下

             然后需要更新一下項(xiàng)目,就不報(bào)錯(cuò)了帽驯。


          6龟再、報(bào)錯(cuò)2,編寫(xiě)jsp時(shí)報(bào)錯(cuò)

            錯(cuò)誤信息為缺少serlvet-jar和jsp-jar包

            解決:使用pom.xml定位導(dǎo)入相應(yīng)的jar包

              找到j(luò)sp-jar包尼变,scope的作用是表示該jar包的作用范圍利凑,provided表示在編譯和測(cè)試期有效,在運(yùn)行期則無(wú)效嫌术。具體后面講解pom.xml時(shí)會(huì)講解到哀澈。

              找到servle-jar包

              pom.xml中檢查,修改

              修改完后蛉威,發(fā)現(xiàn)兩個(gè)jar包都加載進(jìn)來(lái)了日丹,項(xiàng)目完好,不在報(bào)錯(cuò)了蚯嫌。


6.3哲虾、創(chuàng)建maven項(xiàng)目

          都一樣,在項(xiàng)目參數(shù)那里修改即可

          結(jié)果

          maven項(xiàng)目一般沒(méi)用择示,在開(kāi)發(fā)中將一個(gè)項(xiàng)目拆分成多個(gè)項(xiàng)束凑,就需要使用maven項(xiàng)目(pom項(xiàng)目)將其他子項(xiàng)目進(jìn)行整合,下一章節(jié)講解栅盲,很重要汪诉。很重要。


6.4、myeclipse maven操作

        6--9 都是快捷方式

          9 測(cè)試扒寄,相當(dāng)于命令行 mvn test

          8 安裝鱼鼓,相當(dāng)于命令行 mvn install? 作用:將其上傳到本地倉(cāng)庫(kù),具體見(jiàn)上面講解

          7 關(guān)聯(lián)源碼该编,這個(gè)不需要解釋吧迄本,平常我們使用別的jar包也關(guān)聯(lián)過(guò)源碼

          6 清理,mvn clean

        5 maven bulid  執(zhí)行maven命令课竣,等效 mvn

        4?maven build? 5快速的操作

          如果沒(méi)有操作過(guò)嘉赎,與5相同

          如果操作過(guò)一次,將直接執(zhí)行上一次5的命令

          如果操作多次于樟,將提供選擇框


6.5公条、例子,將maven web項(xiàng)目發(fā)布到tomcat運(yùn)行

          命令:tomcat:run

          通過(guò)網(wǎng)址即可訪問(wèn)迂曲,同時(shí)會(huì)將該項(xiàng)目上傳到本地倉(cāng)庫(kù)靶橱。


七、pom.xml的依賴(lài)關(guān)系講解(重點(diǎn))

    之前一直在使用pom.xml中找jar包最關(guān)鍵的三個(gè)屬性奢米,groupId抓韩、artifactId、version鬓长,應(yīng)該有些印象了谒拴,也知道為什么通過(guò)這三個(gè)能找到對(duì)應(yīng)的jar包,但是沒(méi)有細(xì)講其中的一些小的知識(shí)點(diǎn)涉波,比如上面添加servlet-jar和jsp-jar的依賴(lài)時(shí)苍日,出現(xiàn)的一些屬性就不太懂见剩,所以,這一章節(jié)没炒,就將依賴(lài)關(guān)系全面分析。

7.1降允、如何獲取坐標(biāo)(也就是三個(gè)關(guān)鍵屬性值)

      方式1:使用網(wǎng)站搜索[從中央倉(cāng)庫(kù)拿]

        步驟一:百度搜索關(guān)鍵字“maven repository”

        步驟二:輸入關(guān)鍵字查詢(xún)獲得需要內(nèi)容真慢,確定需要版本

        步驟三毅臊、獲得坐標(biāo)


       方式2、使用本地倉(cāng)庫(kù)黑界,通過(guò)myeclipse獲得坐標(biāo)

         上面已經(jīng)介紹過(guò)了如何從本地倉(cāng)庫(kù)獲取對(duì)應(yīng)jar管嬉,這里在簡(jiǎn)單闡述一下

         步驟一:添加依賴(lài),pom.xml文件中园爷,右鍵

         步驟二:獲得坐標(biāo)

7.2宠蚂、依賴(lài)(坐標(biāo))的常見(jiàn)配置

         為了避免不知道說(shuō)的哪些配置屬性,看下面圖就明白了童社,就是dependency下的屬性配置求厕,全部有9個(gè),講其中的7個(gè)。

         groupId呀癣、artifactId美浦、version是依賴(lài)的基本坐標(biāo),缺一不可项栏,這三個(gè)可以不用將浦辨,都知道,重要的是除了這三個(gè)之外的配置屬性需要我們理解

type:依賴(lài)的類(lèi)型,比如是jar包還是war包等

            默認(rèn)為jar,表示依賴(lài)的jar包

注意:pom.lastUpdated 這個(gè)我們?cè)谏厦嫣砑觭ervlet-jar的時(shí)候就遇到過(guò)榕莺,看到lastUpdated的意思是表示使用更新描述信息镣典,占位符作用,通俗點(diǎn)講,選擇該類(lèi)型,jar包不會(huì)被加載進(jìn)來(lái),只是將該jar包的一些描述信息加載進(jìn)來(lái)摊滔,使別的jar包在引用他時(shí),能夠看到一些相關(guān)的提示信息店乐,僅此而已艰躺,所以說(shuō)他是個(gè)占位符,只要記住他的jar包不會(huì)被加載進(jìn)來(lái)眨八。

optional:標(biāo)記依賴(lài)是否可選腺兴。默認(rèn)值false

            比如struts2中內(nèi)置了log4j這個(gè)記錄日志的功能,就是將log4j內(nèi)嵌入struts2的jar包中踪古,而struts2有沒(méi)有l(wèi)og4j這個(gè)東西都沒(méi)關(guān)系含长,有它,提示的信息更多伏穆,沒(méi)它拘泞,也能夠運(yùn)行,只是提示的信息就相對(duì)而言少一些枕扫,所以這個(gè)時(shí)候陪腌,就可以對(duì)它進(jìn)行可選操作,想要它就要烟瞧,不想要诗鸭,就設(shè)置為false。

exclusions:排除傳遞依賴(lài)参滴,解決jar沖突問(wèn)題

            依賴(lài)傳遞的意思就是强岸,A項(xiàng)目 依賴(lài) B項(xiàng)目,B項(xiàng)目 依賴(lài) C項(xiàng)目砾赔,當(dāng)使用A項(xiàng)目時(shí)蝌箍,就會(huì)把B也給加載進(jìn)來(lái)青灼,這是傳遞依賴(lài),依次類(lèi)推妓盲,C也會(huì)因此給加載進(jìn)來(lái)杂拨。

            這個(gè)有依賴(lài)傳遞有好處,也有壞處悯衬,壞處就是jar包的沖突問(wèn)題弹沽,比如,A 依賴(lài) B(B的版本為1)筋粗,C 依賴(lài) B(B的版本為2)策橘,如果一個(gè)項(xiàng)目同時(shí)需要A和C,那么A,C都會(huì)傳遞依賴(lài)將B給加載進(jìn)來(lái)娜亿,問(wèn)題就在這里役纹,兩個(gè)B的版本不一樣,將兩個(gè)都加載進(jìn)去就會(huì)引起沖突暇唾,這時(shí)候就需要使用exclusions這個(gè)屬性配置了。maven也會(huì)有一個(gè)機(jī)制避免兩個(gè)都加載進(jìn)去辰斋,maven 默認(rèn)配置在前面的優(yōu)先使用策州,但是我們還是需要使用exclusions來(lái)配置更合理,這里使用spring bean 和?struts2 spring plugin 來(lái)舉例子說(shuō)明這個(gè)問(wèn)題并使用exclusions解決這個(gè)問(wèn)題宫仗。(spring bean 和 struts2 spring plugin都需要依賴(lài)spring-core够挂,但版本不一樣)

            從本地倉(cāng)庫(kù)中找到這兩個(gè)jar包

maven自己的解決方案如下

maven 默認(rèn)配置在前面的優(yōu)先使用,下面是證明

                先將spring-beans加載進(jìn)去的藕夫,所以會(huì)將spring-beans依賴(lài)的spring-core的版本加載進(jìn)來(lái)孽糖。

                先將struts2-spring-plugin加載進(jìn)來(lái),那么就會(huì)將其依賴(lài)的spring-core的版本加載進(jìn)來(lái)

使用exclusions來(lái)配置

               即使struts2-spring-plugin 配置在前面毅贮,也需要使用3.2.0版本办悟。則需要為struts2-spring-plugin 排除依賴(lài)(不使用3.0.5依賴(lài))

               注意:這樣,就將struts2-spring-plugin依賴(lài)的spring-core的版本排除依賴(lài)了滩褥,也就是該依賴(lài)的spring-core不會(huì)在加載進(jìn)來(lái)病蛉,查看代碼,看是否符合要求瑰煎,如果不符合要求铺然,需要手動(dòng)的修改


scope:依賴(lài)范圍,意思就是通過(guò)pom.xml加載進(jìn)來(lái)的jar包酒甸,來(lái)什么范圍內(nèi)使用生效魄健,范圍包括編譯時(shí),運(yùn)行時(shí)插勤,測(cè)試時(shí)

            compile:默認(rèn)值沽瘦,如果選擇此值革骨,表示編譯、測(cè)試和運(yùn)行都使用當(dāng)前jar

            test:表示只在測(cè)試時(shí)當(dāng)前jar生效其垄,在別的范圍內(nèi)就不能使用該jar包苛蒲。例如:junit 。此處不寫(xiě)也不報(bào)錯(cuò)绿满,因?yàn)槟J(rèn)是compile臂外,compile包擴(kuò)了測(cè)試

            runtime,表示測(cè)試和運(yùn)行時(shí)使用當(dāng)前jar喇颁,編譯時(shí)不用該jar包漏健。例如:JDBC驅(qū)動(dòng)。JDBC驅(qū)動(dòng)橘霎,在編譯時(shí)(也就是我們寫(xiě)代碼的時(shí)候都是采用接口編程蔫浆,壓根就沒(méi)使用到JDBC驅(qū)動(dòng)包內(nèi)任何東西,只有在運(yùn)行時(shí)才用的到姐叁,所以這個(gè)是典型的使用runtime這個(gè)值的例子)瓦盛,此處不寫(xiě)也不報(bào)錯(cuò),理由同上

            provided外潜,表示編譯和測(cè)試時(shí)使用當(dāng)前jar原环,運(yùn)行時(shí)不在使用該jar了。例如:servlet-api处窥、jsp-api等嘱吗。【必須填寫(xiě)】

               什么意思呢滔驾? 在我們以前創(chuàng)建web工程谒麦,編寫(xiě)servlet或者jsp時(shí),就沒(méi)導(dǎo)入過(guò)jar包把哆致,因?yàn)閙yeclipse或者別的ide幫我們提供了這兩個(gè)jar包绕德,內(nèi)置了,所以我們?cè)诰幾g期測(cè)試期使用servlet都不會(huì)報(bào)缺少jar包的錯(cuò)誤摊阀,而在運(yùn)行時(shí)期迁匠,離開(kāi)了myeclipse或別的ide,就相當(dāng)于缺失了這兩個(gè)jar包驹溃,但此時(shí)tomcat又會(huì)幫我們提供這兩個(gè)jar城丧,以便我們不會(huì)報(bào)錯(cuò),所以豌鹤,這兩個(gè)很特殊亡哄。看圖

               1布疙、開(kāi)發(fā)階段(MyEclipse提供)蚊惯,看下圖以此證明我們說(shuō)的

java web 5.0項(xiàng)目:

java web 6.0項(xiàng)目:

               2愿卸、運(yùn)行階段(tomcat提供)

               所以,根據(jù)這個(gè)特點(diǎn)截型,如果使用maven開(kāi)發(fā)項(xiàng)目趴荸,就不是web項(xiàng)目了,那么myeclipse就不會(huì)在給我們提供這兩個(gè)jar包宦焦,我們就必須自己手動(dòng)通過(guò)坐標(biāo)從倉(cāng)庫(kù)中獲取发钝,但是針對(duì)上面的分析,當(dāng)運(yùn)行的時(shí)候波闹,tomcat會(huì)幫我們提供這兩個(gè)jar包酝豪,所以我們自己從倉(cāng)庫(kù)中獲取的jar包就不能和tomcat中的沖突,那么就正好可以通過(guò)provided這個(gè)屬性精堕,來(lái)設(shè)置這兩個(gè)jar的作用范圍孵淘,就是在變異時(shí)期和測(cè)試時(shí)期生效即可。

               這個(gè)例子就可以解釋上面創(chuàng)建maven web時(shí)產(chǎn)生的錯(cuò)誤和解決方案了歹篓。

            system:表示我們自己手動(dòng)加入的jar包瘫证,不屬于maven倉(cāng)庫(kù)(本地,第三方等)庄撮,屬于別得類(lèi)庫(kù)的這樣的jar包痛悯,只在編譯和測(cè)試期生效,運(yùn)行時(shí)無(wú)效重窟。一般不用


7.3、依賴(lài)調(diào)節(jié)原則

          這個(gè)就是maven解決傳遞依賴(lài)時(shí)jar包沖突問(wèn)題的方法惧财,按照兩種原則巡扇,上面已經(jīng)介紹了一種了,就是下面的第二原則

            1垮衷、第一原則:路徑近者優(yōu)先原則

                    A-->B-->C-->D-->X(1.6)

                    E-->D-->X(2.0)

               使用X(2.0)厅翔,因?yàn)槠渎窂礁?/p>

2、第二原則:第一聲明者優(yōu)先原則搀突。就是如果路徑相同刀闷,maven 默認(rèn)配置在前面的優(yōu)先使用

                    A-->B --> X(1.6)

                    C-->D--> X(2.0)

               這樣就是路徑相同,那么如果A在前面仰迁,C在后面甸昏,則使用X(1.6)

            maven會(huì)先根據(jù)第一原則進(jìn)行選擇,第一原則不成徐许,則按第二原則處理施蜜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市雌隅,隨后出現(xiàn)的幾起案子翻默,更是在濱河造成了極大的恐慌缸沃,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件修械,死亡現(xiàn)場(chǎng)離奇詭異趾牧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肯污,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)翘单,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人仇箱,你說(shuō)我怎么就攤上這事县恕。” “怎么了剂桥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵忠烛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我权逗,道長(zhǎng)美尸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任斟薇,我火速辦了婚禮师坎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堪滨。我一直安慰自己胯陋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布袱箱。 她就那樣靜靜地躺著遏乔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪发笔。 梳的紋絲不亂的頭發(fā)上盟萨,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音了讨,去河邊找鬼捻激。 笑死,一個(gè)胖子當(dāng)著我的面吹牛前计,可吹牛的內(nèi)容都是我干的胞谭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼男杈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼韭赘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起势就,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤泉瞻,失蹤者是張志新(化名)和其女友劉穎脉漏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體袖牙,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侧巨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鞭达。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片司忱。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖畴蹭,靈堂內(nèi)的尸體忽然破棺而出坦仍,到底是詐尸還是另有隱情,我是刑警寧澤叨襟,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布繁扎,位于F島的核電站,受9級(jí)特大地震影響糊闽,放射性物質(zhì)發(fā)生泄漏梳玫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一右犹、第九天 我趴在偏房一處隱蔽的房頂上張望提澎。 院中可真熱鬧,春花似錦念链、人聲如沸盼忌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谦纱。三九已至,卻和暖如春梆暮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绍昂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工啦粹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窘游。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓唠椭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親忍饰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贪嫂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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