maven實戰-----讀書筆記之第六章~~第八章

第六章 Maven倉庫

1.倉庫的分類:倉庫分爲本地倉庫,遠程倉庫,中央倉庫,私服。java

本地倉庫:本機上的maven倉庫,setting配置本地倉庫路徑,以下圖,下載下來的jar包都會存儲在D:\java\repository中。算法

遠程倉庫:本地倉庫比如書房,當想要讀某本書的時候,會先在本地倉庫裏面找有沒有,若是沒有,則去書店購買,遠程倉庫就比如這書店,當我買到想讀的書以後,就會保存在書房中,下回想在讀該本書,就直接去書房找,本地倉庫只有一個,但遠程倉庫能夠配置多個。
中央倉庫:maven會默認一個可用的遠程倉庫,不須要配置,maven會自動識別這個倉庫,這個倉庫就是中央倉庫。spring

私服:私服是一種特殊的遠程倉庫,他是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的maven用戶使用,當maven須要下載依賴jar包的時候,他會請求私服,若是私服不存在,他會再去外部的遠程倉庫下載,下載完畢存放到私服上,下次使用則請求的是私服,另外,咱們也能夠將一些公共的服務做爲依賴上傳至私服,項目中多個團隊人使用的時候,就不須要相互拷貝,直接下載就能夠,他的好處是節省本身外網的寬帶,加速maven構建,部署第三方插件(就是公共服務只對內開放,屬於公司本身的業務jar依賴),提升穩定性,加強控制,下降中央倉庫的負荷。設計模式

2.遠程倉庫的配置,當中央倉庫沒法知足項目的需求,可能項目須要的依賴在另一個遠程倉庫,入JBoss Maven倉庫,這時,能夠在POM中配置該倉庫。maven

在repositories中,能夠申明一個或者多個遠程倉庫,該例子中,申明瞭一個id爲jboss,名稱爲JBoss Repository的倉庫,任何一個倉庫申明的id必須是惟一的,maven自帶的中央倉庫id使用的是central,若是其餘倉庫申明也使用了該id,則會覆蓋中央倉庫的配置,該配置中,releases和snapshots比較重要,他們用來控制maven對於發佈版構件和快照版構件的下載,該例子中realeases的enable爲true,表示支持JBoss倉庫的發佈版下載支持,snapshots爲false,表示關閉JBoss倉庫的快照版下載支持,根據該配置,maven則只會從JBoss倉庫下載發佈版的構件,而不會下載快照版的構件。layout的值是default,表示倉庫的佈局是maven2及maven3的默認佈局而不是maven1,對於releases和snapshots來講,他還有另外兩個子元素,updatePolicy和checksumPolicy,updatePolicy表明更新頻率,默認的daily一天一次,never爲從不檢查更新,always爲每次構建時都檢查一次,interval:X  表示每隔X檢查更新一次。元素checksumPolicy用來配置maven檢查校驗和文件的策略,當構件被部署到maven倉庫中,會同時部署對應的校驗和文件,當下載構件時,maven會驗證校驗和文件,當校驗失敗時,當checksumPolicy的值設置爲warn,maven會在執行構件時輸出警告信息,fail,maven遇到校驗和錯誤時就讓構建失敗,ignore,使maven徹底忽略校驗和錯誤。工具

3.遠程倉庫的認證佈局

大部分遠程倉庫無需認證就能夠訪問,有時候出於徹底考慮,須要提供認證信息才能夠訪問一些遠程倉庫,好比私服。學習

4.部署至遠程倉庫測試

私服一大做用是部署第三方文件,包括組織內部生成的構件以及一些沒法從外部倉庫直接獲取的構件,這些構件咱們須要部署到私服上,供其餘團隊成員使用,編輯項目中的pom.xml,配置以下,其中注意的是id應該與setting.xml中一個server元素中的id相同,且用戶名,密碼都須要正確匹配。ui

上傳命令:mvn clean deploy,maven就會將項目構建輸出的構件部署到配置對應的遠程倉庫,若是項目當前的版本是快照版本,則會部署到快照版本倉庫地址,不然會部署到發佈版本倉庫地址,以下圖是一個部署一個快照版本的輸出:

5.快照版本

這樣的配置就是一個快照版本,快照版本是不穩定的半成熟品,當開發穩定以後,將version改爲1.0.0,則此時變成了發佈版本。

6.鏡像

若是鏡像X能夠提供倉庫Y存儲的全部內容,那麼久能夠認爲X是Y的一個鏡像,鏡像常見的用法就是配合私服使用,因爲私服能夠代理任何外部的公共倉庫,包括中央倉庫,對於組織內部而言,使用一個私服地址就等於使用了全部須要的外部倉庫,能夠將配置集中到私服中,從而簡化maven的配置,以下圖所示,就是一個maven私服的配置。

 

 

第七章 Maven生命週期與插件

1.Maven的生命週期就是爲了對全部的構建過程進行抽象和統一,maven從大量項目和構建工具中學習和反思,總結了一套高度完善的,易擴展的生命週期,這個生命週期包含了項目的清理,初始化,編譯,測試,打包,集成測試,驗證,部署和站點生成等幾乎全部的構建步驟。

maven的生命週期是抽象的,意味着生命週期自己不作任何實際的工做,在maven的設計中,實際的任務(如編譯源代碼)都由插件來完成,這種思想和設計模式中的模板模式類似,模板方法在父類中定義算法的總體結構,子類能夠經過實現重寫父類的方法來控制實際的行爲,保證了算法有足夠的可擴展性,有能夠嚴格控制算法的總體結構。,以下的模板方法能很好的體現maven生命週期的概念:

這段代碼很是簡單,build()方法定義了整個構建的過程,依次是初始化,編譯,測似,打包(因爲package與java關鍵字衝突,這裏使用了單詞packagee),集成測試,部署,可是這個類並無具體現實初始化,編譯,打包,集成測試,部署,由子類去實現。

2.三套生命週期

初學者每每覺得Maven的生命週期是一個總體,Maven擁有三套相互獨立的生命週期,他們分別是clean,default,site,clean生命週期的目的是清除項目,default生命週期的目的是構建項目,而site生命週期的目的是創建項目站點。

 

3.命令行與生命週期

4.插件目標

第八章 聚合和繼承

1.聚合

其實就是父級目錄,他的獨特之處就是packaging爲pom,不然沒法建模,它的核心是<modules><module></module></modules>,稱爲聚合模塊,聚合模塊放在項目的最底層,其餘模塊做爲聚合模塊的子模塊目錄存在,

 2.繼承

就是父模塊聲明的一些元素能夠被子模塊直接繼承,子模塊不須要在重複聲明這些元素,如下是可繼承的pom元素

 

3.依賴管理

上圖能夠看出dependencies也能夠被子模塊繼承,若是子模塊A和子模塊B都用到了spring相關的jar包,那麼,能夠把spring相關的依賴都寫在父模塊,這個時候子模塊A和子模塊B就能夠不用在配置sping的依賴,能夠簡化配置,可是存在的問題是,若是我新增一個子模塊C,可是C不須要spring的依賴,那麼因爲繼承的關係,模塊也會自動引入spring的依賴,這樣很差,maven爲咱們提供了一個dependencyManager的元素,他的好處是方便咱們依賴版本管理,父模塊定義一個spring版本爲4.3.16,那麼子類不須要再聲明spring的版本了,方便總體的版本升級,還有一點,dependencyManager它只會聲明這些依賴,他並不會正真引入這些jar包,子模塊想用那個jar包,能夠自行去引用,子模塊中才會真正去下載依賴,運用很是靈活,以下圖所示

                                                        父模塊聲明依賴

                  子模塊引入依賴

4.插件管理

Maven提供了dependencyManager元素幫助管理依賴,相似的,Maven也提供了pluginManager元素幫助管理插件,該元素依賴不會形成實際的插件調用行爲,

只有子模塊真正去引用父模塊中的插件時纔會引入,以下圖所示,子模塊配置簡化不少,若是子模塊想引入不一樣的版本和配置,則能夠在子模塊自行修改,則會直接覆蓋父模塊的版本,以及裏面的配置。

5.聚合和繼承的關係

聚合:父模塊知道哪些子模塊被聚合到一塊兒了,子模塊殊不知道這個聚合模塊的存在。

繼承:父模塊不知道哪些子模塊繼承它,可是子模塊必須知道父模塊。

共同點:他們的packaging元素都是pom,他們出了pom.xml以外,通常都沒有實際的內容

實際項目中,通常父模塊都融合了聚合和繼承,以下圖所示:

6.反應堆

反應堆的構建順序:它會先構建父模塊,而後若是子模塊A依賴子模塊B,那麼它會先構建B模塊,而後在構建A模塊,maven中不容許A依賴B,B又依賴A的狀況,不然會報錯。

裁剪反應堆:maven用戶能夠選擇構建多個或者單個子模塊,命令以下圖:

 

相關文章
相關標籤/搜索