Maven3[1].0學(xué)習(xí)手冊_第1頁
Maven3[1].0學(xué)習(xí)手冊_第2頁
Maven3[1].0學(xué)習(xí)手冊_第3頁
Maven3[1].0學(xué)習(xí)手冊_第4頁
Maven3[1].0學(xué)習(xí)手冊_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、maven3.0學(xué)習(xí)手冊(入門篇)1 maven簡介1.1 何為mavenmaven是一個跨平臺的項目管理工具,主要用于基于java平臺的項目構(gòu)建、依賴管理和項目信息管理。1.1.1 項目構(gòu)建作為一個異常強(qiáng)大的構(gòu)建工具,從清理、編譯、測試到生成報告,再到打包和部署,maven能夠幫助我們自動化構(gòu)建過程。1.1.2 依賴管理幾乎任何java應(yīng)用都會借用一些第三方的開源類庫,這些類庫都可以通過依賴的方式引入到項目里來,隨著依賴的增多,版本不一致、版本沖突、依賴臃腫等問題會接踵而來。maven提供了一個免費(fèi)的中央倉庫,在其中幾乎可以找到任何的流行開源類庫。maven給類庫世界引入了經(jīng)緯,通過一組坐標(biāo)

2、maven能夠找到任何一個java類庫,我們可以借助它來管理依賴,解決那些復(fù)雜的依賴問題。1.1.3 項目信息管理maven能夠幫助我們管理原本分散在項目中各個角落的項目信息,包括項目描述、開發(fā)者列表、版本控制系統(tǒng)地址、許可證、缺陷管理系統(tǒng)地址等。此外,通過maven自動生成的站點,以及一些已有的插件,我們能夠輕松獲得項目文檔、測試報告、靜態(tài)分析報告、源碼版本日志報告等項目信息。2 maven的安裝和配置2.1 在windows上安裝maven2.1.1 檢查jdk安裝在安裝maven之前,首先要確認(rèn)你已經(jīng)正確安裝了jdk。maven可以運(yùn)行在jdk 1.4及以上的版本上。2.1.2 下載ma

3、venmaven下載頁面:/download.html。maven分發(fā)包:apache-maven-3.0.3-bin.zip2.1.3 本地安裝將安裝文件解壓到你指定的目錄中,如:d:apache-maven-3.0.3,接著設(shè)置環(huán)境變量,將maven安裝配置到操作系統(tǒng)環(huán)境中。新建m2_home變量,變量值為maven的安裝目錄d:apache-maven-3.0.3。修改path變量,在變量值的末尾加上%m2_home%bin。2.1.4 驗證安裝情況打開一個新的cmd窗口,運(yùn)行如下命令檢查maven的安裝情況。2.2 安裝目錄分析2.2.1 m

4、aven安裝目錄前面設(shè)置m2_home環(huán)境變量指向maven的安裝目錄,讓我們看一下該目錄的結(jié)構(gòu)和內(nèi)容: bin:該目錄包含了mvn運(yùn)行的腳本,這些腳本用來配置java命令,準(zhǔn)備好classpath和相關(guān)的java系統(tǒng)屬性,然后執(zhí)行java命令。此外,該目錄還包含m2.conf文件,這是classworlds的配置文件。 boot:該目錄只包含一個文件,plexus-classworlds是一個類加載器框架,相對于默認(rèn)的java類加載器,maven使用該框架加載自己的類庫。對于一般的maven用戶來說,不必關(guān)心該文件。 conf:該目錄包含了一個非常重要的文件settings.xml。直接修改

5、該文件,就能在機(jī)器上全局地定制maven的行為。一般情況下,我們更偏向于復(fù)制該文件至/.m2/目錄下(這里表示用戶目錄),然后修改該文件,在用戶范圍定制maven的行為。 lib:該目錄包含了所有maven運(yùn)行時需要的java類庫。2.2.2 maven用戶目錄首先運(yùn)行一條簡單的命令:mvn help:system。該命令會打印出所有的java系統(tǒng)屬性和環(huán)境變量。打開用戶目錄c:documents and settingsadministrator。在用戶目錄下,我們可以發(fā)現(xiàn).m2文件夾。默認(rèn)情況下,該文件夾下放置了maven本地倉庫.m2/repository,所有的maven構(gòu)件(arti

6、fact)都被存儲到該倉庫中,以方便重用。默認(rèn)情況下,/.m2目錄下除了repository倉庫之外就沒有其他目錄和文件了,不過大多數(shù)maven用戶需要復(fù)制m2_home/conf/settings.xml文件到/.m2/settings.xml。2.3 安裝m2eclipse核心組件m2e:/sites/m2e額外組件m2e-extras:/sites/m2e-extras3 maven使用入門3.1 maven入門3.1.1 編寫pommaven項目的核心是pom.xml。pom

7、(projectobjectmodel,項目對象模型)定義了項目的基本信息,用于描述項目如何構(gòu)建,聲明項目依賴等?,F(xiàn)在我們先為helloworld項目編寫一個最簡單的pom.xml。首先創(chuàng)建一個名為helloworld的文件夾,打開該文件夾,新建一個名為pom.xml的文件,輸入其內(nèi)容如下:代碼的第一行是project元素,project是所有pom.xml的根元素,它聲明了一些pom相關(guān)的命名空間及xsd元素。根元素下的第一個子元素modelversion指定了當(dāng)前pom模型的版本,對于maven 3來說,它只能是4.0.0。這段代碼中最重要的是groupid,artifactid和vers

8、ion三行。這三個元素定義了一個項目基本的坐標(biāo),在maven的世界,任何的jar、pom或者war都是以基于這些基本的坐標(biāo)進(jìn)行區(qū)分的。groupid定義了項目屬于哪個組,這個組往往和項目所在的組織或公司存在關(guān)聯(lián),類似于java語言中包的概念。artifactid定義了當(dāng)前maven項目在組中唯一的id,我們?yōu)檫@個helloworld項目定義artifactid為helloworld。顧名思義,version指定了helloworld項目當(dāng)前的版本0.0.1-snapshot。snapshot意為快照,說明該項目還處于開發(fā)中,是不穩(wěn)定的版本。最后一個name元素聲明了一個對于用戶更為友好的項目名

9、稱。3.1.2 編寫主代碼默認(rèn)情況下,maven項目主代碼位于src/main/java目錄,我們遵循maven的約定,創(chuàng)建該目錄,然后在該目錄下創(chuàng)建程序文件:com/lunengsoft/mvnapp/helloworld/helloworld.java,其內(nèi)容如代碼:關(guān)于該java代碼有兩點需要注意。(1) 我們應(yīng)該把項目主代碼放到src/main/java/目錄下(遵循maven的約定),而無須額外的配置,maven會自動搜尋該目錄找到項目主代碼。(2) 該java類的包名是com. lunengsoft. mvnapp.helloworld,這與我們之前在pom中定義的groupid和

10、artifactid相吻合。一般來說,項目中java類的包都應(yīng)該基于項目的groupid和artifactid,這樣更加清晰,更加符合邏輯,也方便搜索構(gòu)件或者java類。代碼編寫完畢后,我們使用maven進(jìn)行編譯,在項目根目錄(helloworld)下運(yùn)行命令mvn clean compile,我們會得到如下輸出:clean告訴maven清理輸出目錄target/,compile告訴maven編譯項目主代碼,從輸出中我們看到maven首先執(zhí)行了clean:clean任務(wù),刪除target/目錄,默認(rèn)情況下maven構(gòu)建的所有輸出都在target/目錄中;接著執(zhí)行resources:resour

11、ces任務(wù)(未定義項目資源,暫且略過);最后執(zhí)行compiler:compile任務(wù),將項目主代碼編譯至target/classes目錄(編譯好的類為com/lunengsoft/mvnapp/helloworld /helloworld.class)。3.1.3 編寫測試代碼maven項目中默認(rèn)的主代碼目錄是src/main/java,對應(yīng)地,maven項目中默認(rèn)的測試代碼目錄是src/test/java。因此,在編寫測試用例之前,我們先創(chuàng)建該目錄。要使用junit,我們首先需要為helloworld項目添加一個junit依賴,修改項目的pom,增加以下配置。代碼中添加了dependenci

12、es元素,該元素下可以包含多個dependency元素以聲明項目的依賴,這里我們添加了一個依賴groupid是junit,artifactid是junit,version是4.9,有了這段聲明,maven就能夠自動訪問中央倉庫下載junit-4.9.jar。上述pom代碼中還有一個值為test的元素scope,scope為依賴范圍,若依賴范圍為test則表示該依賴只對測試有效,換句話說,測試代碼中的import junit代碼是沒有問題的,但是如果我們在主代碼中用import junit代碼,就會造成編譯錯誤。如果不聲明依賴范圍,那么默認(rèn)值就是compile,表示該依賴對主代碼和測試代碼都有效

13、。配置了測試依賴,接著就可以編寫測試類,回顧一下前面的helloworld類,現(xiàn)在我們要測試該類的sayhello()方法,檢查其返回值是否為“hello maven.”。在src/test/java目錄下創(chuàng)建文件,其內(nèi)容如下:測試用例編寫完后就可以調(diào)用maven執(zhí)行測試,運(yùn)行mvn clean test:命令行輸入的是mvn clean test,而maven實際執(zhí)行的可不止這兩個任務(wù),暫時我們需要了解的是,在maven執(zhí)行測試(test)之前,它會先自動執(zhí)行項目主資源處理,主代碼編譯,測試資源處理,測試代碼編譯等工作,這是maven生命周期的一個特性。根據(jù)輸出的測試報告,顯示一共運(yùn)行了多少

14、測試,失敗了多少,出錯了多少,跳過了多少。顯然,我們的測試通過了build successful。3.1.4 打包和安裝將項目進(jìn)行編譯、測試之后,下一個重要步驟就是打包(package),默認(rèn)使用打包類型jar,我們可以簡單地執(zhí)行命令mvn clean package進(jìn)行打包,可以看到如下輸出:這里我們看到j(luò)ar:jar任務(wù)負(fù)責(zé)打包,實際上就是jar插件的jar目標(biāo)將項目主代碼打包成一個名為helloworld-0.0.1-snapshot.jar的文件,該文件也位于target/輸出目錄中,它是根據(jù)artifact-version.jar規(guī)則進(jìn)行命名的。如果有需要的話,就可以復(fù)制這個jar文

15、件到其他項目的classpath中從而使用helloworld類。但是,如何才能讓其他的maven項目直接引用這個jar呢?我們還需要一個安裝的步驟,執(zhí)行mvn clean install:從輸出我們看到install:install任務(wù)將項目輸出的jar安裝到了maven本地倉庫中,我們可以打開相應(yīng)的文件夾看到helloworld項目的pom和jar。只有將helloworld的構(gòu)件安裝到本地倉庫之后,其他maven項目才能使用它。3.1.5 運(yùn)行默認(rèn)打包生成的jar是不能夠直接運(yùn)行的,因為帶有main方法的類信息不會添加到manifest中(我們可以打開jar文件中的meta-inf/ma

16、nifest.mf文件,將無法看到main-class一行)。為了生成可執(zhí)行的jar文件,我們需要借助maven-shade-plugin,配置該插件如下:執(zhí)行mvn clean install,待構(gòu)建完成之后打開target/目錄,我們可以看到helloworld-0.0.1-snapshot.jar和original-helloworld-0.0.1-snapshot.jar,前者是帶有main-class信息的可運(yùn)行jar,后者是原始的jar。3.2 maven使用3.2.1 使用archetype生成項目骨架一些maven的約定:在項目的根目錄中放置pom.xml,在src/main/

17、java目錄中放置項目的主代碼,在src/test/java中放置項目的測試代碼。我們稱這些基本的目錄結(jié)構(gòu)和pom.xml文件內(nèi)容稱為項目的骨架,maven提供了archetype以幫助我們快速勾勒出項目骨架。進(jìn)入需要創(chuàng)建maven項目的目錄,運(yùn)行:mvn archetype:generate緊接著會看到一段長長的輸出,有很多可用的archetype供選擇,每一個archetype前面都會對應(yīng)有一個編號,同時命令行會提示一個默認(rèn)的編號,其對應(yīng)的archetype為maven archetype quickstart。直接回車選擇該archetype并選擇使用默認(rèn)版本,緊接著maven會提示輸入

18、要創(chuàng)建項目的groupid、artifactid、version以及包名package。如下輸入并確認(rèn)。插件將根據(jù)我們提供的信息創(chuàng)建項目骨架。在當(dāng)前目錄下,創(chuàng)建一個名為ln2010(我們定義的artifactid)的子目錄,從中可以看到項目的基本結(jié)構(gòu):基本的pom.xml已經(jīng)被創(chuàng)建,里面包含了必要的信息以及一個junit依賴。主代碼目錄src/main/java已經(jīng)被創(chuàng)建,在該目錄下還有一個java類com.lunengsoft.mvnapp.ln2010.app,而這個類也僅僅只有一個簡單的輸出hello world!的main方法。測試代碼目錄src/test/java也被創(chuàng)建好了,并且包

19、含了一個測試用例com.lunengsoft.mvnapp.ln2010.apptest。3.2.2 eclipse插件使用導(dǎo)入maven項目選擇菜單項file,然后選擇import,在該對話框中選擇maven目錄下的existing maven projects,然后單擊next按鈕,就會出現(xiàn)import projects對話框。在該對話框中單擊browse按鈕選擇helloworld的根目錄(即包含pom.xml文件的那個目錄),這時對話框中的projects:部分就會顯示該目錄包含的maven項目,單擊finish按鈕導(dǎo)入完成。創(chuàng)建maven項目選擇菜單項filenewother,在彈出

20、的對話框中選擇maven下的maven project,然后單擊next按鈕,在彈出的new maven project對話框中,使用默認(rèn)的選項(不要選擇create a simple project選項,那樣我們就能使用maven archetype),單擊next按鈕,此時m2eclipse會提示我們選擇一個archetype。這里選擇maven archetype quickstart,再單擊next按鈕,輸入groupid、artifactid、version、package,單擊finish按鈕,maven項目創(chuàng)建完成。運(yùn)行mvn命令我們需要在命令行輸入如mvn clean inst

21、all之類的命令來執(zhí)行maven構(gòu)建,m2eclipse中也有對應(yīng)的功能。在maven項目或者pom.xml上右擊,再在彈出的快捷菜單中選擇run as,就能看到常見的maven命令,選擇想要執(zhí)行的maven命令就能執(zhí)行相應(yīng)的構(gòu)建,同時也能在eclipse的console中看到構(gòu)建輸出。4 坐標(biāo)和依賴4.1 何為maven坐標(biāo)maven的世界中擁有數(shù)量非常巨大的構(gòu)件,也就是平時用的一些jar,war等文件。在maven為這些構(gòu)件引入坐標(biāo)概念之前,我們無法使用任何一種方式來唯一標(biāo)識所有這些構(gòu)件。maven定義了這樣一組規(guī)則:世界上任何一個構(gòu)件都可以使用maven坐標(biāo)唯一標(biāo)識,maven坐標(biāo)的元素

22、包括groupid,artifactid,version,packaging,classifier?,F(xiàn)在,只要我們提供正確的坐標(biāo)元素,maven就能找到對應(yīng)的構(gòu)件。maven內(nèi)置了一個中央倉庫的地址(/maven2),該中央倉庫包含了世界上大部分流行的開源項目構(gòu)件,maven會在需要的時候去那里下載。4.2 坐標(biāo)詳解maven坐標(biāo)為各種構(gòu)件引入了秩序,任何一個構(gòu)件都必須明確定義自己的坐標(biāo),而一組maven坐標(biāo)是通過一些元素定義的,它們是groupid、artifactid、version、packaging、chassifier。先看一組坐標(biāo)定義,如下

23、:下面詳細(xì)解釋一下各個坐標(biāo)元素: groupid:定義當(dāng)前maven項目隸屬的實際項目。首先,maven項目和實際項目不一定是一對一的關(guān)系。比如springframework這一實際項目,其對應(yīng)的maven項目會有很多,如:spring-core、spring-context等。這是由于maven中模塊的概念,因此,一個實際項目往往會被劃分成很多模塊。其次,groupid不應(yīng)該對應(yīng)項目隸屬的組織或公司。原因很簡單,一個組織下會有很多個實際項目,如果groupid只定義到組織級別,而后面我們會看到,artifactid只能定義maven項目(模塊),那么實際項目這個層將難以定義。 artifac

24、tid:該元素定義實際項目中的一個maven項目(模塊),推薦的做法是使用實際項目名稱作為artifactid前綴,這樣做的好處是方便尋找實際構(gòu)件。在默認(rèn)情況下,maven生成的構(gòu)件,其文件名會以artifactid作為開頭,如nexus-indexer-2.0.0.jar,使用實際項目名稱作為前綴之后,就能方便從一個lib文件夾中找到某個項目的一組構(gòu)件。 version:該元素定義maven項目當(dāng)前所處的版本。maven定義了一套完整的版本規(guī)范,以及快照(snapshot)的概念。 packaging:該元素定義maven項目的打包方式。打包方式會影響到構(gòu)建的生命周期,比如jar打包和war

25、打包會使用不同的命令。當(dāng)不定義packaging的時候,maven會使用默認(rèn)值jar。 classifier:該元素用來幫助定義構(gòu)建輸出的一些附屬構(gòu)件。附屬構(gòu)件與主構(gòu)件對應(yīng),如上例中的主構(gòu)件是nexus-indexer-2.0.0.jar,該項目可能還會通過使用一些插件生成如nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources.jar這樣一些附屬構(gòu)件,其包含了java文檔和源代碼。這時候,javadoc和sources就是這兩個附屬構(gòu)件的classifier。這樣,附屬構(gòu)件也就擁有了自己唯一的坐標(biāo)。注意,不能直接定義項目的cla

26、ssifier,因為附屬構(gòu)件不是項目直接默認(rèn)生成的,而是由附加的插件幫助生成。上述5個元素中,groupid,artifactid,version是必須定義的,packaging是可選的(默認(rèn)為jar),而classifier是不能直接定義的。項目構(gòu)件的文件名是與坐標(biāo)相對應(yīng)的,一般的規(guī)則為artifactid-version-classifier.packaging,-classifier表示可選。4.3 依賴配置依賴會有基本的groupid、artifactid和version等元素組成。其實一個依賴聲明可以包含如下的一些元素:根元素project下的dependencies可以包含一個或多

27、個dependency元素,以聲明一個或或多個項目依賴。每個依賴可以包含的元素有: groupid、artifactid和version:依賴的基本坐標(biāo),對于任何一個依賴來說,基本坐標(biāo)是最重要的,maven根據(jù)坐標(biāo)才能找到需要的依賴。 type:依賴的類型,對應(yīng)于項目坐標(biāo)定義的packaging。大部分情況下,該元素不必聲明,其默認(rèn)值為jar。 scope:依賴的范圍。 optional:標(biāo)記依賴是否可選。 exclusions:用來排除傳遞性依賴。4.3.1 依賴范圍maven在編譯項目主代碼的時候需要使用一套classpath。假如,在編譯項目主代碼的時候需要用到spring-core,該

28、文件以依賴的方式被引入到classpath中。maven在編譯和執(zhí)行測試代碼的時候會使用另外一套classpath。如junit就是一個很好的例子,該文件也以依賴的方式引入到測試使用的classpath中,不同的是這里的依賴范圍是test。最后,實際運(yùn)行maven項目的時候,又會使用一套classpath。依賴范圍就是用來控制依賴與這三種classpath(編譯classpath,測試classpath,運(yùn)行classpath)的關(guān)系,maven有以下幾種依賴范圍: compile:編譯依賴范圍。如果沒有指定,就會默認(rèn)使用該依賴范圍。使用此依賴范圍的maven依賴,對于編譯、測試、運(yùn)行三種cl

29、asspath都有效。如spring-core。 test:測試依賴范圍。使用此依賴范圍的maven依賴,只對于測試classpath有效,在編譯主代碼或者運(yùn)行項目時將無法使用此類依賴。如junit。 provided:已提供依賴范圍。使用此依賴范圍的maven依賴,對于編譯和測試classpath有效,但在運(yùn)行時無效。如servlet-api,編譯和測試項目的時候需要該依賴,但在運(yùn)行項目的時候,由于容器已經(jīng)提供,就不需要maven重復(fù)地引入一遍。 runtime:運(yùn)行時依賴范圍。使用此依賴范圍的maven依賴,對于測試和運(yùn)行classpath有效,但在編譯主代碼時無效。如jdbc驅(qū)動實現(xiàn),項

30、目主代碼的編譯只需要jdk提供的jdbc接口,只有在執(zhí)行測試或者運(yùn)行項目的時候才需要實現(xiàn)上述接口的具體jdbc驅(qū)動。 system:系統(tǒng)依賴范圍。該依賴與三種classpath的關(guān)系,和provided依賴范圍完全一致。但是,使用system范圍的依賴時必須通過systempath元素顯式地指定依賴文件的路徑。由于此類依賴不是通過maven倉庫解析的,而且往往與本機(jī)系統(tǒng)綁定,可能造成構(gòu)建的不可移植,因此應(yīng)該謹(jǐn)慎使用。systempath元素可以引用環(huán)境變量,如: import(maven2.0.9及以上):導(dǎo)入依賴范圍。該依賴范圍不會對三種classpath產(chǎn)生實際的影響。4.3.2 傳遞性依

31、賴何為傳遞性依賴假如有一個項目a,該項目有一個org.springframework:spring-core:2.5.6的依賴,而實際上spring-core也有自己的依賴,其包含一個commons-logging依賴。該依賴沒有聲明依賴范圍,那么其依賴范圍就是默認(rèn)的compile。項目a有一個compile范圍的spring-core依賴,spring-core有一個compile范圍的commons-logging依賴,那么commons-logging就會成為項目a的compile范圍依賴,commons-loggins是項目a的一個傳遞性依賴。有了傳遞性依賴機(jī)制,在使用spring的時

32、候就不用去考慮它依賴了什么,也不用擔(dān)心引入多余的依賴。maven會解析各個直接依賴的pom,將那些必要的間接依賴,以傳遞依賴的形式引入到當(dāng)前的項目中。傳遞性依賴和依賴范圍依賴范圍不僅可以控制依賴與三種classpath的關(guān)系,還對傳遞性依賴產(chǎn)生影響。上面的例子中,項目a對于spring-core的依賴范圍是compile,spring-core對于commons-logging的依賴范圍是compile,那么項目a對于commons-logging這一傳遞性依賴的范圍也就是compile。假設(shè)a依賴b,b依賴c,我們說a對于b是第一直接依賴,b對于c是第二直接依賴,a對于c是傳遞性依賴。第一直

33、接依賴的范圍和第二直接依賴的范圍決定了傳遞性依賴的范圍,如下圖,最左邊一列表示第一直接依賴范圍,最上面一行表示第二直接依賴范圍,中間交叉單元格表示傳遞性依賴范圍。12compiletestprovidedruntimecompilecompile-runtimetesttest-testprovidedprovided-providedprovidedruntimeruntime-runtime4.3.3 依賴調(diào)解maven引入的傳遞性依賴機(jī)制,一方面大大簡化和方便了依賴聲明,另一方面,大部分情況下我們只需要關(guān)心項目的直接依賴是什么,而不用考慮這些直接依賴會引入什么傳遞性依賴。但有時候,當(dāng)傳遞

34、性依賴造成問題的時候,我們就需要清楚地知道該傳遞性依賴是從哪條依賴路徑引入的。例如,項目a有這樣的依賴關(guān)系 : a-b-c-x(1.0)、a-d-x(2.0),x是a的傳遞性依賴,但是兩條依賴路徑上有兩個版本的x,那么哪個x會被maven解析使用呢?兩個版本都被解析顯然是不對的,因為那會造成依賴重復(fù),因此必須選擇一個。maven依賴調(diào)解的第一原則:路徑最近者優(yōu)先。該例中x(1.0)的路徑長度為3,而x(2.0)的路徑長度為2,因此x(2.0)會被解析使用。依賴調(diào)解第一原則不能解決所有問題,比如這樣的依賴關(guān)系:a-b-y(1.0),a-c-y(2.0),y(1.0)和y(2.0)的依賴路徑長度是

35、一樣的,都為2。那么到底誰會被解析使用呢?在maven2.0.8及之前的版本中,這是不確定的,但是maven2.0.9開始,為了盡可能避免構(gòu)建的不確定性,maven定義了依賴調(diào)解的第二原則:第一聲明者優(yōu)先。在依賴路徑長度相等的前提下,在pom中依賴聲明的順序決定了誰會被解析使用。順序最靠前的那個依賴優(yōu)勝。4.3.4 可選依賴假設(shè)有這樣一個依賴關(guān)系,項目a依賴于項目b,項目b依賴于項目x和y,b對于x和y的依賴都是可選依賴:a-b、b-x(可選)、b-y(可選)。根據(jù)傳遞性依賴的定義,如果所有這三個依賴的范圍都是compile,那么x、y就是a的compile范圍傳遞性依賴。然而,由于這里x、y

36、是可選依賴,依賴將不會得以傳遞。換句話說,x、y將不會對a有任何影響。為什么要使用可選依賴這一特性呢?可能項目b實現(xiàn)了兩個特性,其中的特性一依賴于x,特性二依賴于y,而且這兩個特性是互斥的,用戶不可能同時使用兩個特性。比如b是一個持久層隔離工具包,它支持多種數(shù)據(jù)庫,包括mysql,postgresql等,在構(gòu)建這個工具包的時候,需要這兩種數(shù)據(jù)庫的驅(qū)動程序,但在使用這個工具包的時候,只會依賴一個數(shù)據(jù)庫。項目b的依賴聲明如下:上述xml代碼片段中,使用元素表示mysql-connector-java和postgresql這兩個依賴為可選依賴,它們只會對當(dāng)前項目b產(chǎn)生影響,當(dāng)其他項目依賴于b的時候,

37、這兩個依賴不會被傳遞。因此,當(dāng)項目a依賴于項目b的時候,如果其實際使用基于mysql數(shù)據(jù)庫,那么在項目a中就需要顯式地聲明mysql-connector-java這一依賴。4.4 最佳實踐4.4.1 排除依賴傳遞性依賴會給項目隱式地引入很多依賴,這極大地簡化了項目依賴的管理。但是有些時候這種特性也會帶來問題。例如,當(dāng)前項目有一個第三方依賴,而這個第三方依賴由于某些原因依賴了另外一個類庫的snapshot版本,那么這個snapshot就會成為當(dāng)前項目的傳遞性依賴,而snapshot的不穩(wěn)定性會直接影響到當(dāng)前的項目。這時候需要排除掉該snapshot,并且在當(dāng)前項目中聲明該類庫的某個正式發(fā)布版本。還有一些情況,你可能也想要替換某個傳遞性依賴,比如:sun jta api,hibernate依賴于這個jar,但是由于版權(quán)的因素。該類庫不在中央倉庫中,而apache geronimo項目有一個對應(yīng)的實現(xiàn)。這時你就可以排除sun jta api,再聲明geronimo和jta api實現(xiàn)。上述代碼中,項目a依賴于項目b,但是由于一些原因,不想引入傳遞性依賴c,而是自己顯式地聲明對于項目c1.1.0版本的依賴。代碼中使用exclusions元素聲明排除依賴,exclusions可以包含一個或多個exclusion子元素,因此可

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論