Maven實(shí)戰(zhàn)之Maven倉(cāng)庫(kù)
Maven倉(cāng)庫(kù)作用
倉(cāng)庫(kù),顧名思義就是存放物品的地方蜗字。在Maven中仇参,我們可以將其倉(cāng)庫(kù)理解為就是存放jar包的地方,在前面的小節(jié)中嫩絮,我們提到了Maven的中央倉(cāng)庫(kù)丛肢,該倉(cāng)庫(kù)是Maven的默認(rèn)倉(cāng)庫(kù),基本上包含了常見(jiàn)的Java開(kāi)源庫(kù)的jar包及其相關(guān)信息剿干。
倉(cāng)庫(kù)的路徑
在前面的小節(jié)中蜂怎,當(dāng)需要使用一個(gè)依賴(lài)的時(shí)候,Maven要求我們必須提供其對(duì)應(yīng)的坐標(biāo) ( groupId置尔,ArtifactId杠步,version 等信息 ),該信息除了區(qū)分不同的依賴(lài)外,很重要的一個(gè)作用就是標(biāo)識(shí)自己在倉(cāng)庫(kù)中對(duì)應(yīng)的存放位置幽歼,Maven中倉(cāng)庫(kù)的默認(rèn)存放路徑為 GroupId/ArtifactId/version/ArtifactId-version-[classifier].extension朵锣,比如spring-core,它的坐標(biāo)為
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
則其對(duì)應(yīng)的路徑為org.springframework/spring-core/4.3.7/spring-core.4.3.7.RELEASE.jar甸私,其中的extension來(lái)自于package中的聲明诚些,默認(rèn)為jar
倉(cāng)庫(kù)的類(lèi)型
在Maven中,只有兩種類(lèi)型的倉(cāng)庫(kù):本地倉(cāng)庫(kù)皇型、遠(yuǎn)程倉(cāng)庫(kù)诬烹,如果進(jìn)行細(xì)分的話(huà),遠(yuǎn)程倉(cāng)庫(kù)還可以進(jìn)一步劃分為:中央倉(cāng)庫(kù)弃鸦、私服绞吁、其他公共庫(kù)。本地倉(cāng)庫(kù)以及中央倉(cāng)庫(kù)唬格、其他公共倉(cāng)庫(kù)的概念顯而易見(jiàn)家破,私服指的是一般公司自己搭建的內(nèi)部的倉(cāng)庫(kù),不對(duì)外開(kāi)放购岗,同時(shí)該倉(cāng)庫(kù)可以作為公司內(nèi)部的公共倉(cāng)庫(kù)汰聋,并且只由該私服倉(cāng)庫(kù)訪問(wèn)其他倉(cāng)庫(kù),這樣做可以減少公司的對(duì)外帶寬藕畔,提高效率马僻,同時(shí)減少對(duì)其他倉(cāng)庫(kù)的訪問(wèn)。
配置遠(yuǎn)程倉(cāng)庫(kù)
當(dāng)Maven在構(gòu)建的時(shí)候注服,發(fā)現(xiàn)本地倉(cāng)庫(kù)缺少相對(duì)應(yīng)的構(gòu)建的時(shí)候韭邓,就會(huì)從遠(yuǎn)程倉(cāng)庫(kù)中查詢(xún)、獲取該構(gòu)建溶弟,由于默認(rèn)是中央倉(cāng)庫(kù)女淑,而有時(shí)候中央倉(cāng)庫(kù)可能出現(xiàn)網(wǎng)絡(luò)問(wèn)題或者我們需要的構(gòu)建不在中央倉(cāng)庫(kù)中,這個(gè)時(shí)候配置其他遠(yuǎn)程倉(cāng)庫(kù)就很有必要了辜御,配置方式如下:配置pom.xml
<project>
...
<repositories><!--可以配置多個(gè)遠(yuǎn)程倉(cāng)庫(kù)-->
<repository><!--配置一個(gè)倉(cāng)庫(kù)-->
<id>倉(cāng)庫(kù)的ID</id><!--ID沒(méi)有其他要求鸭你,但該ID在本文件中應(yīng)該唯一-->
<name>倉(cāng)庫(kù)的名字</name><!--用于開(kāi)發(fā)人員識(shí)別--->
<url>倉(cāng)庫(kù)的地址</url><!--該地址很重要,是倉(cāng)庫(kù)唯一的地址-->
<snapshots><enable>false</enable></snapshots><!--不使用snapshot狀態(tài)的構(gòu)建-->
<releases><enable>true</enable></releases><!--使用release狀態(tài)的構(gòu)建-->
</repository>
</repositories>
</project>
配置倉(cāng)庫(kù)認(rèn)證信息
有時(shí)候擒权,有些遠(yuǎn)程倉(cāng)庫(kù)需要進(jìn)行身份驗(yàn)證袱巨,有時(shí)這是很有必要的,如在公司內(nèi)部碳抄,可能有些倉(cāng)庫(kù)只允許特定的人員訪問(wèn)愉老,配置方式如下
注意,這里的配置是在setting.xml文件中配置剖效,原因很顯然嫉入,pom.xml會(huì)隨著構(gòu)建的發(fā)布提交給其他用戶(hù)焰盗,這是比較危險(xiǎn)的做法
<setting>
...
<servers>
<server>
<!--這里的ID要與需要身份認(rèn)證的倉(cāng)庫(kù)中的ID保持一致,這也是為什么倉(cāng)庫(kù)中ID需要保持唯一的原因之一-->
<id>倉(cāng)庫(kù)的ID</id>
<username>用戶(hù)名</username>
<password>密碼</password>
</server>
</servers>
</setting>
部署至遠(yuǎn)程倉(cāng)庫(kù)
有時(shí)候我們可能需要將構(gòu)建好的構(gòu)建部署到遠(yuǎn)程倉(cāng)庫(kù)中咒林,供其他開(kāi)發(fā)人員使用熬拒,配置的方式如下,pom.xml
<project>
...
<distributionManagement>
<repository>
<!--ID唯一垫竞,一般來(lái)說(shuō)需要部署的倉(cāng)庫(kù)都需要驗(yàn)證身份澎粟,所以還需要配置認(rèn)證,方式見(jiàn)上面-->
<id>要部署的倉(cāng)庫(kù)的ID</id>
<name>倉(cāng)庫(kù)的名稱(chēng)</name>
<url>倉(cāng)庫(kù)的地址</url>
</repository>
</distributionManagement>
</project>
當(dāng)代碼編寫(xiě)完成件甥,通過(guò)測(cè)試之后捌议,執(zhí)行命令mvn clean deploy
就可以將其部署到對(duì)應(yīng)的倉(cāng)庫(kù)中,供其他開(kāi)發(fā)者使用引有。
關(guān)于快照版本
需要存在的原因如下
告知其他使用該構(gòu)建的開(kāi)發(fā)者,該構(gòu)建屬于測(cè)試版倦逐,不建議在實(shí)際生產(chǎn)中使用
方便Maven進(jìn)行歸類(lèi)管理譬正,方便用戶(hù)構(gòu)建時(shí)進(jìn)行選擇
倉(cāng)庫(kù)解析依賴(lài)機(jī)制
在Maven中,依賴(lài)的解析方式如下:首先是檢查本地倉(cāng)庫(kù)是否存在檬姥、存在則使用曾我,不存在,則向默認(rèn)的遠(yuǎn)程倉(cāng)庫(kù)或者私服查詢(xún)健民,如果有多個(gè)的話(huà)抒巢,先合并所有的遠(yuǎn)程倉(cāng)庫(kù)元信息 groupId/artifactId/maven-metadata.xml文件,然后選擇最合適的構(gòu)建秉犹,然后進(jìn)行解析蛉谜。
鏡像
鏡像,顧名思義崇堵,就是原來(lái)東西的一個(gè)復(fù)制型诚,Maven倉(cāng)庫(kù)的鏡像也是如此,如果一個(gè)倉(cāng)庫(kù)A是另一個(gè)倉(cāng)庫(kù)B的拷貝鸳劳,則稱(chēng)倉(cāng)庫(kù)A是倉(cāng)庫(kù)B的鏡像狰贯。鏡像倉(cāng)庫(kù)的可以用于減緩目標(biāo)倉(cāng)庫(kù)的壓力,同時(shí)赏廓,也可以用于修改默認(rèn)的遠(yuǎn)程倉(cāng)庫(kù)涵紊,配置方式如下setting.xml
<setting>
...
<mirrors><!--配置多個(gè)鏡像倉(cāng)庫(kù)-->
<mirror><!--配置一個(gè)鏡像倉(cāng)庫(kù)-->
<id>倉(cāng)庫(kù)ID</id>
<name>倉(cāng)庫(kù)名稱(chēng)</name>
<url>鏡像倉(cāng)庫(kù)地址</url>
<!--表示鏡像倉(cāng)庫(kù)為原倉(cāng)庫(kù)的鏡像,之后原倉(cāng)庫(kù)的訪問(wèn)會(huì)直接訪問(wèn)鏡像倉(cāng)庫(kù)-->
<mirrorof>原倉(cāng)庫(kù)地址</mirrorof>
<!--可以使用*表示所有幔摸,則所有的訪問(wèn)都會(huì)指向鏡像倉(cāng)庫(kù)-->
</mirror>
</mirrors>
</setting>
倉(cāng)庫(kù)搜索服務(wù)
有時(shí)候我們只知道某一個(gè)構(gòu)建的名稱(chēng)或是組織等一些不足以表示該構(gòu)建坐標(biāo)的信息摸柄,這個(gè)時(shí)候有兩種主要的解決方案
第一種是通過(guò)搜索引擎查找或者訪問(wèn)該構(gòu)建的官網(wǎng)
-
第二種是通過(guò)已有的倉(cāng)庫(kù)搜索服務(wù),有幾個(gè)比較常用的倉(cāng)庫(kù)搜索服務(wù)網(wǎng)站抚太,如下
總結(jié)
在這一小節(jié)中塘幅,我們主要了解了Maven中倉(cāng)庫(kù)的概念昔案,倉(cāng)庫(kù)的種類(lèi),配置遠(yuǎn)程倉(cāng)庫(kù)电媳,配置倉(cāng)庫(kù)認(rèn)證信息踏揣,部署構(gòu)建到遠(yuǎn)程倉(cāng)庫(kù)中,倉(cāng)庫(kù)依賴(lài)解析機(jī)制匾乓,鏡像倉(cāng)庫(kù)捞稿,以及幾個(gè)常用的倉(cāng)庫(kù)搜索服務(wù),Maven的學(xué)習(xí)之路還在繼續(xù)拼缝。