Maven實戰(zhàn)之Maven倉庫
Maven倉庫作用
倉庫,顧名思義就是存放物品的地方。在Maven中,我們可以將其倉庫理解為就是存放jar包的地方,在前面的小節(jié)中,我們提到了Maven的中央倉庫,該倉庫是Maven的默認倉庫,基本上包含了常見的Java開源庫的jar包及其相關(guān)信息。
倉庫的路徑
在前面的小節(jié)中,當需要使用一個依賴的時候,Maven要求我們必須提供其對應的坐標 ( groupId,ArtifactId,version 等信息 ),該信息除了區(qū)分不同的依賴外,很重要的一個作用就是標識自己在倉庫中對應的存放位置,Maven中倉庫的默認存放路徑為 GroupId/ArtifactId/version/ArtifactId-version-[classifier].extension,比如spring-core,它的坐標為
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
則其對應的路徑為org.springframework/spring-core/4.3.7/spring-core.4.3.7.RELEASE.jar,其中的extension來自于package中的聲明,默認為jar
倉庫的類型
在Maven中,只有兩種類型的倉庫:本地倉庫、遠程倉庫,如果進行細分的話,遠程倉庫還可以進一步劃分為:中央倉庫、私服、其他公共庫。本地倉庫以及中央倉庫、其他公共倉庫的概念顯而易見,私服指的是一般公司自己搭建的內(nèi)部的倉庫,不對外開放,同時該倉庫可以作為公司內(nèi)部的公共倉庫,并且只由該私服倉庫訪問其他倉庫,這樣做可以減少公司的對外帶寬,提高效率,同時減少對其他倉庫的訪問。
配置遠程倉庫
當Maven在構(gòu)建的時候,發(fā)現(xiàn)本地倉庫缺少相對應的構(gòu)建的時候,就會從遠程倉庫中查詢、獲取該構(gòu)建,由于默認是中央倉庫,而有時候中央倉庫可能出現(xiàn)網(wǎng)絡(luò)問題或者我們需要的構(gòu)建不在中央倉庫中,這個時候配置其他遠程倉庫就很有必要了,配置方式如下:配置pom.xml
<project>
...
<repositories><!--可以配置多個遠程倉庫-->
<repository><!--配置一個倉庫-->
<id>倉庫的ID</id><!--ID沒有其他要求,但該ID在本文件中應該唯一-->
<name>倉庫的名字</name><!--用于開發(fā)人員識別--->
<url>倉庫的地址</url><!--該地址很重要,是倉庫唯一的地址-->
<snapshots><enable>false</enable></snapshots><!--不使用snapshot狀態(tài)的構(gòu)建-->
<releases><enable>true</enable></releases><!--使用release狀態(tài)的構(gòu)建-->
</repository>
</repositories>
</project>
配置倉庫認證信息
有時候,有些遠程倉庫需要進行身份驗證,有時這是很有必要的,如在公司內(nèi)部,可能有些倉庫只允許特定的人員訪問,配置方式如下
注意,這里的配置是在setting.xml文件中配置,原因很顯然,pom.xml會隨著構(gòu)建的發(fā)布提交給其他用戶,這是比較危險的做法
<setting>
...
<servers>
<server>
<!--這里的ID要與需要身份認證的倉庫中的ID保持一致,這也是為什么倉庫中ID需要保持唯一的原因之一-->
<id>倉庫的ID</id>
<username>用戶名</username>
<password>密碼</password>
</server>
</servers>
</setting>
部署至遠程倉庫
有時候我們可能需要將構(gòu)建好的構(gòu)建部署到遠程倉庫中,供其他開發(fā)人員使用,配置的方式如下,pom.xml
<project>
...
<distributionManagement>
<repository>
<!--ID唯一,一般來說需要部署的倉庫都需要驗證身份,所以還需要配置認證,方式見上面-->
<id>要部署的倉庫的ID</id>
<name>倉庫的名稱</name>
<url>倉庫的地址</url>
</repository>
</distributionManagement>
</project>
當代碼編寫完成,通過測試之后,執(zhí)行命令mvn clean deploy就可以將其部署到對應的倉庫中,供其他開發(fā)者使用。
關(guān)于快照版本
需要存在的原因如下
告知其他使用該構(gòu)建的開發(fā)者,該構(gòu)建屬于測試版,不建議在實際生產(chǎn)中使用
方便Maven進行歸類管理,方便用戶構(gòu)建時進行選擇
倉庫解析依賴機制
在Maven中,依賴的解析方式如下:首先是檢查本地倉庫是否存在、存在則使用,不存在,則向默認的遠程倉庫或者私服查詢,如果有多個的話,先合并所有的遠程倉庫元信息 groupId/artifactId/maven-metadata.xml文件,然后選擇最合適的構(gòu)建,然后進行解析。
鏡像
鏡像,顧名思義,就是原來東西的一個復制,Maven倉庫的鏡像也是如此,如果一個倉庫A是另一個倉庫B的拷貝,則稱倉庫A是倉庫B的鏡像。鏡像倉庫的可以用于減緩目標倉庫的壓力,同時,也可以用于修改默認的遠程倉庫,配置方式如下setting.xml
<setting>
...
<mirrors><!--配置多個鏡像倉庫-->
<mirror><!--配置一個鏡像倉庫-->
<id>倉庫ID</id>
<name>倉庫名稱</name>
<url>鏡像倉庫地址</url>
<!--表示鏡像倉庫為原倉庫的鏡像,之后原倉庫的訪問會直接訪問鏡像倉庫-->
<mirrorof>原倉庫地址</mirrorof>
<!--可以使用*表示所有,則所有的訪問都會指向鏡像倉庫-->
</mirror>
</mirrors>
</setting>
倉庫搜索服務
有時候我們只知道某一個構(gòu)建的名稱或是組織等一些不足以表示該構(gòu)建坐標的信息,這個時候有兩種主要的解決方案
總結(jié)
在這一小節(jié)中,我們主要了解了Maven中倉庫的概念,倉庫的種類,配置遠程倉庫,配置倉庫認證信息,部署構(gòu)建到遠程倉庫中,倉庫依賴解析機制,鏡像倉庫,以及幾個常用的倉庫搜索服務,Maven的學習之路還在繼續(xù)。