倉庫的分類
maven倉庫分為兩類:本地倉庫和遠程倉庫。
當maven根據pom中定義的坐標尋找構件時,首先在本地倉庫中尋找,當找不到時再從遠程倉庫尋找,都找不到時拋出異常。
maven遠程倉庫還可進一步分類:
本地倉庫
默認maven會在c盤創建一個.m2的本地倉庫,如果要修改本地倉庫地址,可以修改setting.xml文件:
<settings>
<localRepository>D:\64\m2\repository</localRepository>
</settings>
遠程倉庫
中央倉庫
使用解壓軟件打開%M2_HOME%/lib/maven-model-builder-3.1.1.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。上述配置中,snapshots子元素enabled的值為false,表示不從中央倉庫下載快照版本的構件。
私服
私服是一種特殊的遠程倉庫,架設於局域網內。當maven需要下載構件時,先從私服尋找,私服中沒有再從外部倉庫下載。
私服有許多顯著的優點:
■ 節省外網帶寬
■ 加速maven構件
■ 部署第三方構件
■ 提高穩定性,增強控制
■ 降低中央倉庫的負荷
遠程倉庫配置
如果默認的遠程中央倉庫無法滿足需求,我們可以在pom中添加遠程倉庫的配置:
<project>
...
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
</project>
在repositories元素下,使用repository元素聲明一個或多個遠程倉庫。上面的xml聲明了一個id為jboss,名稱為JBoss Repository的倉庫。
任何一個倉庫的id是唯一的,maven自帶的中央倉庫使用的id為central,如果其他倉庫的id也為central,那么它將覆蓋自帶的中央倉庫。
url指向倉庫地址,一般該地址都是基於http協議。releases的enabled值為true,表示開啟JBoss倉庫的發布版本下載支持,snapshots的enabled值為false,表示關閉JBoss倉庫的快照版本的下載支持。
release和snapshots元素還可以配置另外兩個子元素:
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
updatePolicy元素配置maven從遠程倉庫檢查更新的頻率,默認值為daily。其他可用值有:never —— 從不檢查更新,always —— 每次構建都檢查更新,interval:X —— 每隔X分鍾檢查一次更新。用戶也可以使用命令 mvn clean install -U強制更新。
checksumPolicy元素用來配置當下載構件時,maven檢驗和驗證失敗時候的動作,默認為warn,即輸出警告信息,ignore則為忽略錯誤。
遠程倉庫認證
如果遠程倉庫出於安全的考慮設置了用戶名和密碼,這時候我們必須在settings.xml中配置:
<settings>
...
<servers>
<server>
<id>my-proj</id>
<username>repo-user</username>
<password>repo_pwd</password>
</server>
</servers>
</settings>
上述xml指定了id為my-proj的遠程倉庫的用戶名和密碼。
部署至遠程倉庫
如前所述,私服一大作用是可以部署第三方構件。無論是開發中生成的構件還是正式發布的構件,都需要部署到私服中供小組中的其他開發人員使用,在maven項目pom中配置:
<project>
...
<distributionManagement>
<snapshotRepository>
<id>user-snapshot</id>
<name>User Porject Snapshot</name>
<url>http://192.168.10.217:8081/nexus/
content/repositories/snapshots/</url>
<uniqueVersion>true</uniqueVersion>
</snapshotRepository>
<repository>
<id>user-release</id>
<name>User Porject Release</name>
<url>http://192.168.10.217:8081/nexus/
content/repositories/releases/</url>
</repository>
</distributionManagement>
</project>
上述xml明確指定了快照版本和發行版本的私服id和地址,如前所述,如果私服設置了賬號密碼,則應該在settings.xml中設置對應id的私服賬號和密碼,就本例來說,我們應該在settings.xml中設置:
<settings>
<servers>
<server>
<id>user-release</id>
<username>deployment</username>
<password>deployment123</password>
</server>
<server>
<id>user-snapshot</id>
<username>deployment</username>
<password>deployment123</password>
</server>
</servers>
</settings>
配置正確后,可以運行命令mvn clean deploy將項目構建輸出的構件部署到對應的遠程倉庫。
快照版本
版本元素version中添加SNAPSHOT標識,表明該構件為快照版本。SNAPSHOT版本的構件發布到私服的過程中,maven會自動加上時間戳。另一位開發者從該私服獲取這個構件的時候,maven會自動獲取時間戳最新的構件。
快照版本只應該在組織內部依賴使用,項目不應該依賴於任何組織外部的快照版本依賴。因為快照版本的不穩定性會對項目造成潛在的危險。
鏡像
如果倉庫B可以提供倉庫A存儲的所有內容,那么就可以認為B是A的一個鏡像。maven默認的遠程中央倉庫由於服務器不在中國,所以訪問速度可能會慢些,這時候可以再settings.xml中配置一個鏡像:
<settings>
...
<mirrors>
<mirror>
<id>maven.net.cn</id>
<name>one of the central mirrors in china</name>
<url>http://maven.net.cn/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
<mirrorOf>的值為central,表示該配置為中央倉庫的鏡像。任何對於中央倉庫的請求都會本轉至該鏡像。
鏡像常用於私服。由於私服可以代理任何外部的公共倉庫,所以可以說私服就是所有倉庫的鏡像。如:
<settings>
...
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.10.217:8081/nexus/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
<mirrorOf>的值為*號,表示http://192.168.10.217:8081/nexus/content/groups/public/是所有外部倉庫的鏡像。任何對遠程倉庫的請求都會被轉到這個地址。
<mirrorOf>的配置:
■ <mirrorOf>*<mirrorOf>:匹配所有的遠程倉庫
■ <mirrorOf>external:*<mirrorOf>:匹配所有不在本機上的遠程倉庫
■ <mirrorOf>repo1,repo2<mirrorOf>:匹配倉庫repo1和repo2
■ <mirrorOf>*,!repo1<mirrorOf>:匹配除了repo1之外的所有遠程倉庫
鏡像倉庫完全屏蔽了被鏡像倉庫,當鏡像倉庫停止服務的時候,maven仍無法訪問被鏡像倉庫,因而將無法下載構建。
倉庫搜索服務
下面列出幾個目前能用的maven坐標服務:
1.The Centrl Repository:http://search.maven.org/
2.Maven Repository:http://www.mvnrepository.com/
3.Nexus Repository Manager:https://repository.sonatype.org/#welcome
《Maven實戰》讀書筆記