1桨踪、為什么使用Maven ?
Maven是干什么用的?這是很多同學(xué)在學(xué)完這個課程后最大的問題芹啥。之所以會提出這個問題锻离,是因為即使不使用Maven我們?nèi)匀豢梢赃M(jìn)行B/S結(jié)構(gòu)項目的開發(fā)。從表述層墓怀、業(yè)務(wù)邏輯層到持久化層再到數(shù)據(jù)庫都有成熟的解決方案——不使用Maven我們一樣可以開發(fā)項目捌馈?所以我們有必要通過企業(yè)開發(fā)中的實際需求來看一看哪些方面是我們現(xiàn)有技術(shù)的不足捺疼。
2疏虫、添加第三方j(luò)ar包
在今天的JavaEE開發(fā)領(lǐng)域,有大量的第三方框架和工具可以供我們使用啤呼。要使用這些jar包最簡單的方法就是復(fù)制粘貼到WEB-INF目錄下的lib目錄下卧秘。但是這會導(dǎo)致每次創(chuàng)建一個新的工程就需要將jar包重復(fù)復(fù)制到lib目錄下,從而造成工作區(qū)中存在大量重復(fù)的文件官扣。
而使用Maven后每個jar包只在本地倉庫中保存一份翅敌,需要jar包的工程只需要維護(hù)一個文本形式的jar包的引用——我們稱之為“坐標(biāo)”。不僅極大的節(jié)約了存儲空間惕蹄,讓項目更輕巧蚯涮,更避免了重復(fù)文件太多而造成的混亂。
3卖陵、jar包之間的依賴關(guān)系
jar包往往不是孤立存在的遭顶,很多jar包都需要在其他jar包的支持下才能夠正常工作,我們稱之為jar包之間的依賴關(guān)系泪蔫。最典型的例子是:commons-fileupload-1.3.jar依賴于commons-io-2.0.1.jar棒旗,如果沒有IO包,F(xiàn)ileUpload包就不能正常工作撩荣。
那么問題來了铣揉,你知道你所使用的所有jar包的依賴關(guān)系嗎饶深?當(dāng)你拿到一個新的從未使用過的jar包,你如何得知他需要哪些jar包的支持呢逛拱?如果不了解這個情況敌厘,導(dǎo)入的jar包不夠,那么現(xiàn)有的程序?qū)⒉荒苷9ぷ餍嗪稀T龠M(jìn)一步俱两,當(dāng)你的項目中需要用到上百個jar包時,你還會人為的旁舰,手工的逐一確認(rèn)它們依賴的其他jar包嗎锋华?這簡直是不可想象的嗡官。
而引入Maven后箭窜,Maven就可以替我們自動的將當(dāng)前jar包所依賴的其他所有jar包全部導(dǎo)入進(jìn)來,無需人工參與衍腥,節(jié)約了我們大量的時間和精力磺樱。用實際例子來說明就是:通過Maven導(dǎo)入commons-fileupload-1.3.jar后,commons-io-2.0.1.jar會被自動導(dǎo)入婆咸,程序員不必了解這個依賴關(guān)系竹捉。
4、處理jar包之間的沖突
上一點說的是jar包不足項目無法正常工作尚骄,但其實有的時候jar包多了項目仍然無法正常工作块差,這就是jar包之間的沖突。
舉個例子:我們現(xiàn)在有三個工程MakeFriend倔丈、HelloFriend憨闰、和Hello。MakeFriend依賴HelloFriend需五,HelloFriend依賴Hello鹉动。而Hello依賴log4j.1.2.17.jar,HelloFriend依賴log4j.1.2.14.jar宏邮。如下圖所示:
那么MakeFriend工程的運(yùn)行時環(huán)境中該導(dǎo)入log4j.1.2.14.jar呢還是log4j.1.2.17.jar呢泽示?
這樣的問題一個兩個還可以手工解決,但如果系統(tǒng)中存在幾十上百的jar包蜜氨,他們之間的依賴關(guān)系會非常復(fù)雜械筛,幾乎不可能手工實現(xiàn)依賴關(guān)系的梳理。
使用Maven就可以自動的處理jar包之間的沖突問題飒炎。因為Maven中內(nèi)置了兩條依賴原則:最短路徑者優(yōu)先和先聲明者優(yōu)先埋哟,上述問題MakeFriend工程會自動使用log4j.1.2.14.jar。
5厌丑、獲取第三方j(luò)ar包
JavaEE開發(fā)中需要使用到的jar包種類繁多定欧,幾乎每個jar包在其本身的官網(wǎng)上的獲取方式都不盡相同渔呵。為了查找一個jar包找遍互聯(lián)網(wǎng),身心俱疲砍鸠,沒有經(jīng)歷過的人或許體會不到這種折磨扩氢。不僅如此,費(fèi)勁心血找的jar包里有的時候并沒有你需要的那個類爷辱,又或者又同名的類沒有你要的方法——以不規(guī)范的方式獲取的jar包也往往是不規(guī)范的录豺。
使用Maven我們可以享受到一個完全統(tǒng)一規(guī)范的jar包管理體系。你只需要在你的項目中以坐標(biāo)的方式依賴一個jar包饭弓,Maven就會自動從中央倉庫進(jìn)行下載双饥,并同時下載這個jar包所依賴的其他jar包——規(guī)范、完整弟断、準(zhǔn)確咏花!一次性解決所有問題!
Tips:在這里我們順便說一下阀趴,統(tǒng)一的規(guī)范幾乎可以說成是程序員的最高信仰昏翰。如果沒有統(tǒng)一的規(guī)范,就意味著每個具體的技術(shù)都各自為政刘急,需要以諸多不同的特殊的方式加入到項目中棚菊;好不容易加入進(jìn)來還會和其他技術(shù)格格不入,最終受苦的是我們叔汁。而任何一個領(lǐng)域的統(tǒng)一規(guī)范都能夠極大的降低程序員的工作難度统求,減少工作量。例如:USB接口可以外接各種設(shè)備据块,如果每個設(shè)備都有自己獨(dú)特的接口码邻,那么不僅制造商需要維護(hù)各個接口的設(shè)計方案,使用者也需要詳細(xì)了解每個設(shè)備對應(yīng)的接口瑰钮,無疑是非常繁瑣的冒滩。
6、將項目拆分成多個工程模塊
隨著JavaEE項目的規(guī)模越來越龐大浪谴,開發(fā)團(tuán)隊的規(guī)模也與日俱增开睡。一個項目上千人的團(tuán)隊持續(xù)開發(fā)很多年對于JavaEE項目來說再正常不過。那么我們想象一下:幾百上千的人開發(fā)的項目是同一個Web工程苟耻。那么架構(gòu)師篇恒、項目經(jīng)理該如何劃分項目的模塊、如何分工呢凶杖?這么大的項目已經(jīng)不可能通過package結(jié)構(gòu)來劃分模塊胁艰,必須將項目拆分成多個工程協(xié)同開發(fā)。多個模塊工程中有的是Java工程,有的是Web工程腾么。
那么工程拆分后又如何進(jìn)行互相調(diào)用和訪問呢奈梳?這就需要用到Maven的依賴管理機(jī)制。大家請看我們的Survey調(diào)查項目拆分的情況
上層模塊依賴下層解虱,所以下層模塊中定義的API都可以為上層所調(diào)用和訪問攘须。
7、實現(xiàn)項目的分布式部署
在實際生產(chǎn)環(huán)境中殴泰,項目規(guī)模增加到一定程度后于宙,可能每個模塊都需要運(yùn)行在獨(dú)立的服務(wù)器上,我們稱之為分布式部署悍汛,這里同樣需要用到Maven捞魁。