1、 倉庫的分類
對於Maven來說,倉庫只分爲兩類:本地倉庫和遠程倉庫。當Maven根據座標尋找構件的時候,它首先會查看本地倉庫,如果本地倉庫存在此構件,則直接使用;如果本地倉庫不存在此構件,或者需要查看是否有更新的構件版本,Maven就會去遠程倉庫查找,發現需要的構件之後,下載到本地倉庫再使用。如果本地倉庫和遠程倉庫都沒有需要的構件,Maven就會報錯。
在這個最基本分類的基礎上,還有必要介紹一些特殊的遠程倉庫。中央倉庫是Maven核心自帶的遠程倉庫,它包含了絕大部分開源的構件。在默認配置下,當本地倉庫沒有Maven需要的構件的時候,它就會嘗試從中央倉庫下載。
私服是另一種特殊的遠程倉庫,爲了節省帶寬和時間,應該在局域網內架設一個私有的倉庫服務器,用其代理所有外部的遠程倉庫。內部的項目還能部署到私服上供其他項目使用。
除了中央倉庫和私服,還有很多其他公開的遠程倉庫,常見的有Java.net.Maven庫(http://download.java.net/maven/2/)和JBoss Maven(http://repository.jboss.com/maven2/)等。
Maven倉庫的分類見下圖:
A、 本地倉庫
修改本地倉庫目錄地址
#/.m2/settings.xml,設置localRepository元素的值爲想要的倉庫地址。例如:
<settings>
<localRepository>D:\java\repository\</localRepository>
<settings>
需要注意的是,默認情況下#/.m2/settings.xml文件是不存在的,用戶需要從Maven安裝目錄複製$M2_HOME/conf/settings.xml文件再進行編輯。
安裝好Maven後,如果不執行任何Maven命令,本地倉庫目錄是不存在的。當用戶輸入第一條Maven命令之後,Maven纔會創建本地倉庫,然後根據配置和需要,從遠程倉庫下載構件至本地倉庫。
B、中央倉庫
由於最原始的本地倉庫是空的,Maven必須知道至少一個可用的遠程倉庫,才能在執行Maven命令的時候下載到需要的構件。中央倉庫就是這樣一個默認的遠程倉庫,Maven的安裝文件自帶了中央倉庫的配置。讀者可以使用解壓工具打開$M2_HOME/lib/maven-model-builder-3.0.jar,然後訪問路徑org/apache/maven/model/pom-4.0.0.xml,可以看到如下配置:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
包含這段配置的文件是所有Maven項目都會繼承的超級POM,稍後的章節會詳細介紹繼承及超級POM
C、私服
私服是一種特殊的遠程倉庫,它是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的Maven用戶使用。當Maven需要下載構件的時候,它從私服請求,如果私服上不存在該構件,則從外部的遠程倉庫下載,緩存在私服上之後,再爲maven的下載請求提供服務。此外,一些無法從外部倉庫下載到的構件也能從本地上傳到私服上供大家使用。
本地私服的好處:節省自己的外網帶寬;加速Maven構建;部署第三方構件;提高穩定性,增強控制;降低中央倉庫的負荷。
1、 遠程倉庫的配置
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
任何倉庫聲明的id必須是唯一的,尤其需要注意的是,Maven自帶的中央倉庫使用的id爲central,如果其他的倉庫聲明也使用該id,就會覆蓋中央倉庫的配置。該配置中的url值指向了倉庫的地址,一般來說,該地址都基於http協議,Maven用戶都可以在瀏覽器中打開倉庫地址瀏覽構件。
該例配置中的releases和snapshots元素比較重要,它們用來控制Maven對於發佈版構件和快照版構件的下載。該例中release的enabled值爲true,表示開啓JBoss倉庫的發佈版本下載支持,而snapshots的enabled值爲false,表示關閉JBoss倉庫的快照版本的下載支持。因此,根據該配置,Maven只會從JBoss倉庫下載發佈版本的構件,而不會下載快照版本的構件。
對於releases和snapshots來說,除了enabled,它們還包含另外兩個子元素updatePolicy和checksumPolicy
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
元素updatePolicy用來配置Maven從遠程倉庫檢查更新的頻率,默認的值是daily,表示Maven每天檢查一次。其他可用的值包括:never-從不更新;always-每次構建都檢查更新;interval:X –每隔X分鐘檢查一次更新。
元素checksumPolicy用來配置Maven檢查檢驗和文件的策略。當構件被部署到Maven倉庫中時,會同時部署對應的檢驗和文件。在下載構件的時候,Maven會驗證校驗和文件,如果檢驗和驗證失敗,怎麼辦?當checksumPolicy的值爲默認的warn時,Maven會在執行構建時輸出警告信息,其他可用的值包括:fail-Maven遇到檢驗和錯誤就讓構建失敗;ignore-使Maven完全忽略檢驗和錯誤。
A、 遠程倉庫的認證
配置認證信息和配置倉庫信息不同,倉庫信息可以直接配置POM文件中,但是認證信息必須配置在settings.xml文件中。這是因爲POM往往是被提交到代碼倉庫中供所有成員訪問的,而settings.xml一般只放在本機。因此,在settings.xml中配置認證信息更爲安全。
<settings>
…
<servers>
<server>
<id>my-proj</id>
<username>repo-user</ username>
<password> repo-pwd</ password>
</server>
</servers>
</settings>
其中,id元素必須與POM中需要認證的repository元素的id完全一致。
B、 部署至遠程倉庫
<project>
...
<distributionManagement>
<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 SnapshotRepository</name>
<url>http://192.168.1.100/content/repositories/proj-snapshots</url>
</snapshotRepository>
</distributionManagement>
...
</project>
distributionManagement包含repository和snapshotRepository子元素,前者表示發佈版本構件的倉庫,後者表示快照版本的倉庫。這兩個元素下都要配置id、name、url,id爲該倉庫的唯一標識,name是爲了方便人閱讀,關鍵的url表示該倉庫的地址。
配置正確後,在命令行運行mvn clean deploy,Maven就會將項目構件輸出的構件部署到配置對應的遠程倉庫,如果項目當前的版本是快照版本,則部署到快照版本倉庫地址,否則就部署到發佈版本倉庫地址。
2、 鏡像
如果倉庫X可以提供倉庫Y存儲的所有內容,那麼就可以認爲X是Y的一個鏡像。換句話說,任何一個可以從倉庫Y獲得的構件,都能夠從它的鏡像中獲取。
<settings>
<mirrors>
<mirror>
<id>ender</id>
<name>ender</name>
<url>http://218.56.10.110:8081/nexus/content/groups/public </url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
該例中<mirrorOf>的值爲central,表示該配置爲中央倉庫的鏡像,任何對於中央倉庫的請求都會轉至該鏡像,用戶也可以使用同樣的方法配置其他倉庫的鏡像。此例爲配置中央倉庫鏡像。
如何配置私服作爲鏡像呢?
<settings>
<mirrors>
<mirror>
<id>internal-repository</id>
<name>Internal Repository Manager</name>
<url>http://192.168.1.100/maven2 </url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
</settings>
該例中<mirrorOf>的值爲星號,表示該配置是所有Maven倉庫的鏡像,任何對於遠程倉庫的請求都會被轉至http://192.168.1.100/maven2/。
爲了滿足一些複雜的需求,Maven還支持更高級的鏡像配置:
<mirrorOf>*</mirrorOf>:匹配所有遠程倉庫。
<mirrorOf>external:*</mirrorOf>:匹配所有遠程倉庫,使用localhost的除外,使用file://協議的除外。也就是說,匹配所有不在本機上的遠程倉庫。
<mirrorOf>repo1,repo2</mirrorOf>:匹配倉庫repo1和repo2,使用逗號分隔多個遠程倉庫。
<mirrorOf>*,!repo1</mirrorOf>:匹配所有遠程倉庫,repo1除外。
需要注意的是,由於鏡像倉庫完全屏蔽了被鏡像倉庫,當鏡像倉庫不穩定或者停止服務的時候,maven仍將無法訪問被鏡像倉庫,因而將無法下載構件。
3、 倉庫搜索服務
使用Maven進行日常開發時,一個常見的問題就是如何尋找需要的依賴,我們可能只知道需要使用類庫的項目名稱,但是添加maven依賴要求提供確切的maven座標。這時就可以使用倉庫搜索服務來根據關鍵字得到Maven座標。在此介紹幾個常用的、功能強大的公共maven倉庫搜索服務。
A、 Sonatype Nexus
地址:http://repository.sonatype.org
Nexus是當前最流行的開源Maven倉庫管理軟件。
B、 MVNrepository