maven3實戰之倉庫(遠程倉庫的配置)
----------
在很多情況下,默認的中央倉庫無法滿足項目的需求,可能項目需要的構件存在于另外一個遠程倉庫中,如:JBoss,Maven倉庫。這時,可以在POM中配置該倉庫,見代碼請單:
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子元素聲明一個或者多個遠程倉庫。該例中聲明了一個id為jboss,名稱為JBoss Repository的倉庫。任何一個倉庫聲明的id必須是唯一的,尤其需要注意的是,maven自帶的中央倉庫使用的id為central,如果其他的倉庫聲明也使用該id,就會覆蓋中央倉庫的配置。該配置中的url值指向了倉庫的地址,一般來說,該地址都基于http協議,maven用戶都可以在瀏覽器中打開倉庫地址瀏覽構件。
該例配置中的releases和snapshots元素比較重要,它們用來控制Maven對于發布版構件和快照版構件的下載。該例中releases的enabled值為true,表示開啟JBoss倉庫的發布版本下載支持,而snapshots的enabled值為false,表示關閉JBoss倉庫的快照版本的下載支持。該例中的layout元素值default表示倉庫的布局是Maven2及Maven3的默認布局,而不是Maven1的布局。
對于releases和snapshots來說,除了enabled,它們還包含另外兩個子元素updatePolicy和checksumPolicy:
Xml代碼

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

- <settings>
- ...
- <servers>
- <server>
- <id>my-proj</id>
- <username>repo-user</username>
- <password>repo-pwd</password>
- </server>
- </servers>
- ...
- </settings>
Maven使用settings.xml文件中并不顯而易見的servers元素及其server子元素配置倉庫認證信息。上例中,倉庫的認證用戶名為repo-user,認證密碼為repo-pwd。這里的關鍵是id元素,settings.xml中server元素的id必須與POM中需要認證的repository元素的id完全一致。換句話說,正是這個Id將認證信息與倉庫配置聯系在了一起。
2.部署至遠程倉庫
私服的一大作用是部署第三方構件,包括組織內部生成的構件以及一些無法從外部倉庫直接獲取的構件。無論是日常開發中生成的構件,還是正式版本發布的構件,都需要部署到倉庫中,供其他團隊成員使用。
Maven除了能對項目進行編譯、測試、打包之外,還能將項目生成的構建部署到倉庫中。首先,需要編輯項目的pom.xml文件。配置distributionManagement元素,見代碼:
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子元素,前者表示發布版本構件的倉庫,后者表示快照版本的倉庫。這兩個元素下都需要配置id、name和url,id為該遠程倉庫的唯一標識,name是為了方便人閱讀,關鍵的url表示該倉庫的地址。
往遠程倉庫部署構件的時候,往往需要認證。就是需要在settings.xml中創建一個server元素,其id與倉庫的id匹配,并配置正確的認證信息。不論遠程倉庫下載構件,還是部署構件至遠程倉庫,當需要認證的時候,配置的方式是一樣的。配置正確后,在命令行運行mvn clean deploy,Maven就會將項目構建輸出的構件部署到配置對應的遠程倉庫,如果項目當前的版本是快照版本,則部署到快照版本倉庫地址,否則就部署到發布版本倉庫地址。