maven3實戰之倉庫(maven倉庫分類)
----------
對於maven來說,倉庫只分為兩類:本地倉庫和遠程倉庫。當maven根據坐標尋找構件的時候,它首先會查看本地倉庫,如果本地倉庫存在此構件,則直接使用;如果本地倉庫不存在此構件,或者需要查看是否有更新的構件版本,maven就會去遠程倉庫查找,發現需要的構件之后,下載到本地倉庫再使用。如果本地倉庫和遠程倉庫都沒有需要的構件,maven就會報錯。
在這個最基本分類的基礎上,還有必要介紹一些特殊的遠程倉庫。中央倉庫是maven核心自帶的遠程倉庫,它包含了絕大部分開源的構件。在默認配置下,當本地倉庫沒有maven需要的構件的時候,它就會嘗試從中央倉庫下載。私服是另一種特殊的遠程倉庫,為了節省帶寬和時間,應該在局域網內架設一個私有的倉庫服務器,用其代理所有外部的遠程倉庫。內部的項目還能部署到私服上供其他項目使用。除了中央倉庫和私服,還有很多其他公開的遠程倉庫,常見的有java.net Maven庫(http://download.java.net/maven/2/)和jboss Maven庫(http://repository.jboss.com/maven2/)等。
1.本地倉庫
默認情況下,不管是在windows還是linux上,每個用戶在自己的用戶目錄下都有一個路徑名為.m2/repository/的倉庫目錄。有時候,因為某些原因(例如C盤空間不夠),用戶會想要自定義本地倉庫目錄地址。這時,可以編輯文件~/.m2/settings.xml,設置localRepository元素的值為想要的倉庫地址。例如:
- <settings>
- <localRepository>D:\java\repository\</localRepository>
- </settings>
這樣,該用戶的本地倉庫地址就被設置成了 D:\java\repository\。需要注意的是,默認情況下,~/.m2/settings.xml文件是不存在的,用戶需要從Maven安裝目錄復制$M2_HOME/conf/settings.xml文件再進行編輯。
一個構件只有在本地倉庫中之后,才能由其他Maven項目使用,那么構件如何進入到本地倉庫中呢?最常見的是依賴Maven從遠程倉庫下載到本地倉庫中。還有一種常見的情況是,將本地項目的構件安裝到Maven倉庫中。例如本地有兩個項目A和B,兩者都無法從遠程倉庫獲得,而同時A又依賴於B,為了能構建A,B就必須首先得以構建並安裝到本地倉庫中。為了安裝項目,我們可以在項目中執行: mvn clean install命令。Install插件的install目標將項目的構建輸出文件安裝到本地倉庫。
2.遠程倉庫
安裝好Maven后,如果不執行任何Maven命令,本地倉庫目錄是不存在的。當用戶輸入第一條Maven命令之后,Maven才會創建本地倉庫,然后根據配置和需要,從遠程倉庫下載構件至本地倉庫。
3.中央倉庫
由於最原始的本地倉庫是空的,Maven必須知道至少一個可用的遠程倉庫,才能在執行Maven命令的時候下載到需要的構件。中央倉庫就是這樣一個默認的遠程倉庫,Maven的安裝文件自帶了中央倉庫的配置。讀者可以使用解壓工具打開jar文件$M2_HOME/lib/maven-model-builder-3.0.jar(在Maven2中,jar文件路徑類似於$M2_HOME/lib/maven-2.2.1-uber.jar),然后訪問路徑:org/apache/maven/model/pom-4.0.0.xml,可以看到如下的配置:
- <repositories>
- <repository>
- <id>central</id>
- <name>Maven Repository Switchboard</name>
- <url>http://repo1.maven.org/maven2</url>
- <layout>default</layout>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
包含這段配置的文件是所有Maven項目都會繼承的超級POM。這段配置使用id central對中央倉庫進行唯一標識,其名稱為Maven Repository Switchboard,它使用default倉庫布局。最后需要注意的是snapshots元素,其子元素enabled的值為false,表示不從該中央倉庫下載快照版本的構件【快照版本的項目是版本不穩定的項目,所以中央倉庫默認是關閉的】。
4.私服
私服是一種特殊的遠程倉庫,它是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的Maven用戶使用。當Maven需要下載構件的時候,它從私服請求,如果私服上不存在該構件,則從外部的遠程倉庫下載,緩存在私服上之后,再為Maven的下載請求提供服務。此外,一些無法從外部倉庫下載到的構件也能從本地上傳到私服上供大家使用。