maven3實(shí)戰(zhàn)之倉(cāng)庫(kù)(遠(yuǎn)程倉(cāng)庫(kù)的配置)
----------
在很多情況下,默認(rèn)的中央倉(cāng)庫(kù)無(wú)法滿(mǎn)足項(xiàng)目的需求,可能項(xiàng)目需要的構(gòu)件存在于另外一個(gè)遠(yuǎn)程倉(cāng)庫(kù)中,如:JBoss,Maven倉(cāng)庫(kù)。這時(shí),可以在POM中配置該倉(cāng)庫(kù),見(jiàn)代碼請(qǐng)單:
Xml代碼

- <project>
- ...
- <repositories>
- <repository>
- <id>jboss</id>
- <name>JBoss Repository</name>
- <url>http://repository.jboss.com/maven2/</url>
- <releases>
- <enabled>true</enabled>
- </releases>
- </repository>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- <layout>default</layout>
- </repositories>
- ...
- </project>
在repositories元素下,可以使用repository子元素聲明一個(gè)或者多個(gè)遠(yuǎn)程倉(cāng)庫(kù)。該例中聲明了一個(gè)id為jboss,名稱(chēng)為JBoss Repository的倉(cāng)庫(kù)。任何一個(gè)倉(cāng)庫(kù)聲明的id必須是唯一的,尤其需要注意的是,maven自帶的中央倉(cāng)庫(kù)使用的id為central,如果其他的倉(cāng)庫(kù)聲明也使用該id,就會(huì)覆蓋中央倉(cāng)庫(kù)的配置。該配置中的url值指向了倉(cāng)庫(kù)的地址,一般來(lái)說(shuō),該地址都基于http協(xié)議,maven用戶(hù)都可以在瀏覽器中打開(kāi)倉(cāng)庫(kù)地址瀏覽構(gòu)件。
該例配置中的releases和snapshots元素比較重要,它們用來(lái)控制Maven對(duì)于發(fā)布版構(gòu)件和快照版構(gòu)件的下載。該例中releases的enabled值為true,表示開(kāi)啟JBoss倉(cāng)庫(kù)的發(fā)布版本下載支持,而snapshots的enabled值為false,表示關(guān)閉JBoss倉(cāng)庫(kù)的快照版本的下載支持。該例中的layout元素值default表示倉(cāng)庫(kù)的布局是Maven2及Maven3的默認(rèn)布局,而不是Maven1的布局。
對(duì)于releases和snapshots來(lái)說(shuō),除了enabled,它們還包含另外兩個(gè)子元素updatePolicy和checksumPolicy:
Xml代碼

- <snapshots>
- <enabled>true</enabled>
- <updatePolicy>daily</updatePolicy>
- <checksumPolicy>ignore</checksumPolicy>
- </snapshots>
元素updatePolicy用來(lái)配置Maven從遠(yuǎn)程倉(cāng)庫(kù)檢查更新的頻率,默認(rèn)的值是daily,表示Maven每天檢查一次。其他可用的值包括:never---從不檢查更新;always---每次構(gòu)建都檢查更新;interval:X---每隔X分鐘檢查一次更新(X為任意整數(shù))。
元素checksumPolicy用來(lái)配置Maven檢查檢驗(yàn)和文件的策略。當(dāng)構(gòu)件被部署到Maven倉(cāng)庫(kù)中時(shí),會(huì)同時(shí)部署對(duì)應(yīng)的校驗(yàn)和文件。在下載構(gòu)件的時(shí)候,Maven會(huì)驗(yàn)證校驗(yàn)和文件,如果校驗(yàn)和驗(yàn)證失敗,怎么辦?當(dāng)checksumPolicy的值為默認(rèn)的warn時(shí),Maven會(huì)在執(zhí)行構(gòu)建時(shí)輸出警告信息,其他可用的值包括:fail---Maven遇到校驗(yàn)和錯(cuò)誤就讓構(gòu)建失敗;ignore---使用Maven完全忽略校驗(yàn)和錯(cuò)誤。
1.遠(yuǎn)程倉(cāng)庫(kù)的認(rèn)證
大部分遠(yuǎn)程倉(cāng)庫(kù)無(wú)須認(rèn)證就可以訪問(wèn),但有時(shí)候出于安全方面的考慮,我們需要提認(rèn)證信息才能訪問(wèn)一些遠(yuǎn)程倉(cāng)庫(kù)。例如,組織內(nèi)部有一個(gè)Maven倉(cāng)庫(kù)服務(wù)器,該服務(wù)器為每個(gè)項(xiàng)目都提供獨(dú)立的Maven倉(cāng)庫(kù),為了防止非法的倉(cāng)庫(kù)訪問(wèn),管理員為每個(gè)倉(cāng)庫(kù)提供了一組用戶(hù)名級(jí)密碼。這時(shí),為了能讓Maven訪問(wèn)倉(cāng)庫(kù)內(nèi)容,就需要配置認(rèn)證信息。
配置認(rèn)證信息和配置倉(cāng)庫(kù)信息不同,倉(cāng)庫(kù)信息可以直接配置在POM文件中,但是認(rèn)證信息必須配置在settings.xml文件中。這是因?yàn)镻OM往往是被提交到代碼倉(cāng)庫(kù)中供所有成員訪問(wèn)的,而settings.xml一般只放在本機(jī)。因此,settings.xml中配置認(rèn)證信息更為安全。假設(shè)需要為一個(gè)id為my-proj的倉(cāng)庫(kù)配置認(rèn)證信息,編輯settings.xml文件見(jiàn)代碼清單:
Xml代碼

- <settings>
- ...
- <servers>
- <server>
- <id>my-proj</id>
- <username>repo-user</username>
- <password>repo-pwd</password>
- </server>
- </servers>
- ...
- </settings>
Maven使用settings.xml文件中并不顯而易見(jiàn)的servers元素及其server子元素配置倉(cāng)庫(kù)認(rèn)證信息。上例中,倉(cāng)庫(kù)的認(rèn)證用戶(hù)名為repo-user,認(rèn)證密碼為repo-pwd。這里的關(guān)鍵是id元素,settings.xml中server元素的id必須與POM中需要認(rèn)證的repository元素的id完全一致。換句話(huà)說(shuō),正是這個(gè)Id將認(rèn)證信息與倉(cāng)庫(kù)配置聯(lián)系在了一起。
2.部署至遠(yuǎn)程倉(cāng)庫(kù)
私服的一大作用是部署第三方構(gòu)件,包括組織內(nèi)部生成的構(gòu)件以及一些無(wú)法從外部倉(cāng)庫(kù)直接獲取的構(gòu)件。無(wú)論是日常開(kāi)發(fā)中生成的構(gòu)件,還是正式版本發(fā)布的構(gòu)件,都需要部署到倉(cāng)庫(kù)中,供其他團(tuán)隊(duì)成員使用。
Maven除了能對(duì)項(xiàng)目進(jìn)行編譯、測(cè)試、打包之外,還能將項(xiàng)目生成的構(gòu)建部署到倉(cāng)庫(kù)中。首先,需要編輯項(xiàng)目的pom.xml文件。配置distributionManagement元素,見(jiàn)代碼:
Xml代碼

- <project>
- ...
- <destributionManagement>
- <repository>
- <id>proj-releases</id>
- <name>Proj Release Repository</name>
- <url>http://192.168.1.100/content/repositories/proj-releases</url>
- </repository>
- <snapshotRepository>
- <id>proj-snapshots</id>
- <name>Proj Snapshot Repository</name>
- <url>http://192.168.1.100/content/repositories/proj-snapshots</url>
- </snapshotRepository>
- </destributionManagement>
- ...
- </project>
distributionManagement包含repository和snapshotRepository子元素,前者表示發(fā)布版本構(gòu)件的倉(cāng)庫(kù),后者表示快照版本的倉(cāng)庫(kù)。這兩個(gè)元素下都需要配置id、name和url,id為該遠(yuǎn)程倉(cāng)庫(kù)的唯一標(biāo)識(shí),name是為了方便人閱讀,關(guān)鍵的url表示該倉(cāng)庫(kù)的地址。
往遠(yuǎn)程倉(cāng)庫(kù)部署構(gòu)件的時(shí)候,往往需要認(rèn)證。就是需要在settings.xml中創(chuàng)建一個(gè)server元素,其id與倉(cāng)庫(kù)的id匹配,并配置正確的認(rèn)證信息。不論遠(yuǎn)程倉(cāng)庫(kù)下載構(gòu)件,還是部署構(gòu)件至遠(yuǎn)程倉(cāng)庫(kù),當(dāng)需要認(rèn)證的時(shí)候,配置的方式是一樣的。配置正確后,在命令行運(yùn)行mvn clean deploy,Maven就會(huì)將項(xiàng)目構(gòu)建輸出的構(gòu)件部署到配置對(duì)應(yīng)的遠(yuǎn)程倉(cāng)庫(kù),如果項(xiàng)目當(dāng)前的版本是快照版本,則部署到快照版本倉(cāng)庫(kù)地址,否則就部署到發(fā)布版本倉(cāng)庫(kù)地址。