詳解Maven倉(cāng)庫(kù)之本地倉(cāng)庫(kù)、遠(yuǎn)程倉(cāng)庫(kù)
什么是Maven倉(cāng)庫(kù)
在不用Maven的時(shí)候,比如說(shuō)以前我們用Ant構(gòu)建項(xiàng)目,在項(xiàng)目目錄下,往往會(huì)看到一個(gè)名為/lib的子目錄,那里存放著各類(lèi)第三方依賴(lài)jar文件,如log4j.jar,junit.jar等等。
每建立一個(gè)項(xiàng)目,你都需要建立這樣的一個(gè)/lib目錄,然后復(fù)制一對(duì)jar文件,這是很明顯的重復(fù)。重復(fù)永遠(yuǎn)是噩夢(mèng)的起點(diǎn),多個(gè)項(xiàng)目不共用相同的jar文件,不僅會(huì)造成磁盤(pán)資源的浪費(fèi),也使得版本的一致性管理變得困難。
此外,如果你使用版本管理工具,如SVN(你沒(méi)有使用版本管理工具?馬上試試SVN吧,它能幫你解決很多頭疼的問(wèn)題),你需要將大量的jar文件提交到代碼庫(kù)里,可是版本管理工具在處理二進(jìn)制文件方面并不出色。
Maven倉(cāng)庫(kù)就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven項(xiàng)目可以從同一個(gè)Maven倉(cāng)庫(kù)中獲取自己所需要的依賴(lài)JAR,這節(jié)省了磁盤(pán)資源。此外,由于Maven倉(cāng)庫(kù)中所有的JAR都有其自己的坐標(biāo),該坐標(biāo)告訴Maven它的組ID,構(gòu)件ID,版本,打包方式等等,因此Maven項(xiàng)目可以方便的進(jìn)行依賴(lài)版本管理。你也不在需要提交JAR文件到SCM倉(cāng)庫(kù)中,你可以建立一個(gè)組織層次的Maven倉(cāng)庫(kù),供所有成員使用。
簡(jiǎn)言之,Maven倉(cāng)庫(kù)能幫助我們管理構(gòu)件(主要是JAR)。
在Maven中,任何一個(gè)依賴(lài)、插件或者項(xiàng)目構(gòu)建的輸出,都可以稱(chēng)之為構(gòu)件。
Maven在某個(gè)統(tǒng)一的位置存儲(chǔ)所有項(xiàng)目的共享的構(gòu)件,這個(gè)統(tǒng)一的位置,我們就稱(chēng)之為倉(cāng)庫(kù)。(倉(cāng)庫(kù)就是存放依賴(lài)和插件的地方)
任何的構(gòu)件都有唯一的坐標(biāo),Maven根據(jù)這個(gè)坐標(biāo)定義了構(gòu)件在倉(cāng)庫(kù)中的唯一存儲(chǔ)路徑,
解讀Maven在倉(cāng)庫(kù)中的存儲(chǔ)路徑:
1.基于groupId準(zhǔn)備路徑,將句點(diǎn)分隔符轉(zhuǎn)成路徑分隔符,就是將 "." 轉(zhuǎn)換成 "/" ; example: org.testng --->org/testng
2.基于artifactId準(zhǔn)備路徑,將artifactId連接到后面:org/testng/testng
3.使用version準(zhǔn)備路徑,將version連接到后面:org/testng/testng/5.8
4.將artifactId于version以分隔符連字號(hào)連接到后面:org/testng/testng/5.8/tesng-5.8
5.判斷如果構(gòu)件有classifier,就要在 第4項(xiàng) 后增加 分隔符連字號(hào) 再加上 classifier,org/testng/testng/5.8/tesng-5.8-jdk5
6.檢查構(gòu)件的extension,如果extension存在,則加上句點(diǎn)分隔符和extension,而extension是由packing決定的,org/testng/testng/5.8/tesng-5.8-jdk5.jar
到這里我們就明白了Maven 對(duì)于構(gòu)件存儲(chǔ)的細(xì)節(jié)。
Maven 倉(cāng)庫(kù)的分類(lèi):
maven的倉(cāng)庫(kù)只有兩大類(lèi):1.本地倉(cāng)庫(kù) 2.遠(yuǎn)程倉(cāng)庫(kù),在遠(yuǎn)程倉(cāng)庫(kù)中又分成了3種:2.1 中央倉(cāng)庫(kù) 2.2 私服 2.3 其它公共庫(kù)
1.本地倉(cāng)庫(kù),顧名思義,就是Maven在本地存儲(chǔ)構(gòu)件的地方。
注:maven的本地倉(cāng)庫(kù),在安裝maven后并不會(huì)創(chuàng)建,它是在第一次執(zhí)行maven命令的時(shí)候才被創(chuàng)建
maven本地倉(cāng)庫(kù)的默認(rèn)位置:無(wú)論是Windows還是Linux,在用戶(hù)的目錄下都有一個(gè).m2/repository/的倉(cāng)庫(kù)目錄,這就是Maven倉(cāng)庫(kù)的默認(rèn)位置
如何更改maven默認(rèn)的本地倉(cāng)庫(kù)的位置:這里要引入一個(gè)新的元素:localRepository,它是存在于maven的settings.xml文件中
1.1 更改配置用戶(hù)范圍的本地倉(cāng)庫(kù):先在/.m2/目錄下創(chuàng)建settings.xml文件,然后在~/.m2/settings.xml,設(shè)置localRepository元素的值為想要的倉(cāng)庫(kù)地址
<settings> <localRepository>D:\maven_new_repository</localRepository> </settings>
這時(shí)候,maven的本地倉(cāng)庫(kù)地址就變成了 D:\maven_new_repository ,注:此時(shí)配置的maven的本地倉(cāng)庫(kù)是屬于用戶(hù)范圍的。
1.2 更改配置全局范圍的本地倉(cāng)庫(kù):在M2_HOME/conf/settings.xml中更改配置,更改配置的方法同上
注:此時(shí)更改后,所有的用戶(hù)都會(huì)受到影響,而且如果maven進(jìn)行升級(jí),那么所有的配置都會(huì)被清除,所以要提前復(fù)制和備份M2_HOME/conf/settings.xml文件
故:一般情況下不推薦配置全局的settings.xml
2. 遠(yuǎn)程倉(cāng)庫(kù)
2.1 說(shuō)到遠(yuǎn)程倉(cāng)庫(kù)先從 最核心的中央倉(cāng)庫(kù)開(kāi)始,中央倉(cāng)庫(kù)是默認(rèn)的遠(yuǎn)程倉(cāng)庫(kù),maven在安裝的時(shí)候,自帶的就是中央倉(cāng)庫(kù)的配置
在maven的聚合與繼承中我們說(shuō)過(guò),所有的maven項(xiàng)目都會(huì)繼承超級(jí)pom,具體的說(shuō),包含了下面配置的pom我們就稱(chēng)之為超級(jí)pom
<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>
中央倉(cāng)庫(kù)包含了絕大多數(shù)流行的開(kāi)源Java構(gòu)件,以及源碼、作者信息、SCM、信息、許可證信息等。一般來(lái)說(shuō),簡(jiǎn)單的Java項(xiàng)目依賴(lài)的構(gòu)件都可以在這里下載到
2.2 私服
私服是一種特殊的遠(yuǎn)程倉(cāng)庫(kù),它是架設(shè)在局域網(wǎng)內(nèi)的倉(cāng)庫(kù)服務(wù),私服代理廣域網(wǎng)上的遠(yuǎn)程倉(cāng)庫(kù),供局域網(wǎng)內(nèi)的Maven用戶(hù)使用。當(dāng)Maven需要下載構(gòu)件的時(shí)候,它從私服請(qǐng)求,如果私服上不存在該構(gòu)件,則從外部的遠(yuǎn)程倉(cāng)庫(kù)下載,緩存在私服上之后,再為Maven的下載請(qǐng)求提供服務(wù)。我們還可以把一些無(wú)法從外部倉(cāng)庫(kù)下載到的構(gòu)件上傳到私服上。
Maven私服的 個(gè)特性:
1.節(jié)省自己的外網(wǎng)帶寬:減少重復(fù)請(qǐng)求造成的外網(wǎng)帶寬消耗
2.加速M(fèi)aven構(gòu)件:如果項(xiàng)目配置了很多外部遠(yuǎn)程倉(cāng)庫(kù)的時(shí)候,構(gòu)建速度就會(huì)大大降低
3.部署第三方構(gòu)件:有些構(gòu)件無(wú)法從外部倉(cāng)庫(kù)獲得的時(shí)候,我們可以把這些構(gòu)件部署到內(nèi)部倉(cāng)庫(kù)(私服)中,供內(nèi)部maven項(xiàng)目使用
4.提高穩(wěn)定性,增強(qiáng)控制:Internet不穩(wěn)定的時(shí)候,maven構(gòu)建也會(huì)變的不穩(wěn)定,一些私服軟件還提供了其他的功能
5.降低中央倉(cāng)庫(kù)的負(fù)荷:maven中央倉(cāng)庫(kù)被請(qǐng)求的數(shù)量是巨大的,配置私服也可以大大降低中央倉(cāng)庫(kù)的壓力
當(dāng)前主流的maven私服:
1.Apache的Archiva
2.JFrog的Artifactory
3.Sonatype的Nexus
三、遠(yuǎn)程倉(cāng)庫(kù)配置
配置遠(yuǎn)程倉(cāng)庫(kù)將引入新的配置元素:<repositories> <repository>
在<repositories>元素下,可以使用 <repository>子元素聲明一個(gè)或者多個(gè)遠(yuǎn)程倉(cāng)庫(kù)。
例子:
<repositories> <repository> <id>jboss</id> <name>JBoss Repository</name> <url>http://repository.jboss.com/maven2/</url> <releases> <updatePolicy>daily</updatePolicy><!-- never,always,interval n --> <enabled>true</enabled> <checksumPolicy>warn</checksumPolicy><!-- fail,ignore --> </releases> <snapshots> <enabled>false</enabled> </snapshots> <layout>default</layout> </repository> </repositories>
<updatePolicy>元素:表示更新的頻率,值有:never, always,interval,daily, daily 為默認(rèn)值
<checksumPolicy>元素:表示maven檢查和檢驗(yàn)文件的策略,warn為默認(rèn)值
出于安全方面的考慮,有時(shí)我們要對(duì)遠(yuǎn)程倉(cāng)庫(kù)的訪問(wèn)進(jìn)行認(rèn)證,一般將認(rèn)證信息配置在settings.xml中:
<servers> <server> <id>same with repository id in pom</id> <username>username</username> <password>pwd</password> </server> </servers>
注:這里的id必須與POM中需要認(rèn)證的repository元素的Id一致。
如何將生成的項(xiàng)目部署到遠(yuǎn)程倉(cāng)庫(kù)
完成這項(xiàng)工作,也需要在POM中進(jìn)行配置,這里有新引入了一個(gè)元素:<distributionManagement>
distributionManagement包含了2個(gè)子元素:repository和snapshotRepository, 前者表示發(fā)布版本構(gòu)件的倉(cāng)庫(kù),后者表示快照版本的倉(cāng)庫(kù)
這兩個(gè)元素都需要配置 id(該遠(yuǎn)程倉(cāng)庫(kù)的唯一標(biāo)識(shí)),name,url(表示該倉(cāng)庫(kù)的地址)
向遠(yuǎn)程倉(cāng)庫(kù)中部署構(gòu)件,需要進(jìn)行認(rèn)證。配置同上
配置正確后運(yùn)行: mvn clean deploy
正確的看待快照
之前我們?cè)谂渲胮om的時(shí)候,對(duì)于快照的配置都很謹(jǐn)慎,或者說(shuō)很少用快照的版本,原因是它還很不穩(wěn)定,極容易給我們的系統(tǒng)帶來(lái)未知的錯(cuò)誤,讓我們很難查找。其實(shí)快照版本也并不是一無(wú)是處,快照最大的用途是用在開(kāi)發(fā)的過(guò)程中,尤其是有模塊依賴(lài)的時(shí)候,比如說(shuō)AB兩個(gè)模塊同時(shí)開(kāi)發(fā),A依賴(lài)于B,開(kāi)發(fā)過(guò)程中AB都是持續(xù)集成的開(kāi)發(fā),不斷的修改POM文件和構(gòu)建工程,這時(shí)候版本同步就成了一個(gè)很大的問(wèn)題。使用快照就可以達(dá)到這一目的。
其實(shí)在快照版本在發(fā)布的過(guò)程中,Maven會(huì)自動(dòng)為構(gòu)件以當(dāng)前時(shí)間戳做標(biāo)記,有了這個(gè)時(shí)間戳,我們就可以隨時(shí)找到最新的快照版本,這樣也就解決剛才說(shuō)的 協(xié)作開(kāi)發(fā)的問(wèn)題。
至于A如何檢查B的更新,剛剛在講配置的時(shí)候說(shuō)過(guò),快照配置中有一個(gè)元素可以控制檢查更新的頻率------updatePolicy
我們也可以使用命令行加參數(shù)的形式強(qiáng)制執(zhí)行讓maven檢查更新:mvn clean install-U
maven到底是如何從倉(cāng)庫(kù)中解析構(gòu)件的呢?----maven從倉(cāng)庫(kù)解析依賴(lài)的機(jī)制
1. 當(dāng)依賴(lài)的范圍是system的時(shí)候,Maven直接從本地文件系統(tǒng)解析構(gòu)件
2. 根據(jù)依賴(lài)坐標(biāo)計(jì)算倉(cāng)庫(kù)路徑后,嘗試直接從本地倉(cāng)庫(kù)尋找構(gòu)件,如果發(fā)現(xiàn)相應(yīng)構(gòu)件,則解析成功
3. 在本地倉(cāng)庫(kù)不存在相應(yīng)的構(gòu)件情況下,如果依賴(lài)的版本是顯示的發(fā)布版本構(gòu)件,則遍歷所有的遠(yuǎn)程倉(cāng)庫(kù),發(fā)現(xiàn)后下載使用
4. 如果依賴(lài)的版本是RELEASE或LATEST, 則基于更新策略讀取所有遠(yuǎn)程倉(cāng)庫(kù)的元數(shù)據(jù),將其于本地倉(cāng)庫(kù)的對(duì)應(yīng)元數(shù)據(jù)合并后,計(jì)算出RELEASE或者LATEST的真實(shí)值,然后基于這個(gè)真實(shí)值檢查本地倉(cāng)庫(kù)
5. 如果依賴(lài)的版本是SNAPSHOT, 則基于更新策略讀取所有遠(yuǎn)程倉(cāng)庫(kù)的元數(shù)據(jù), 將其與本地倉(cāng)庫(kù)的對(duì)應(yīng)元數(shù)據(jù)合并后,得到最新快照版本的值,然后基于該值檢查本地倉(cāng)庫(kù)或從遠(yuǎn)程倉(cāng)庫(kù)下載
6. 如果最后解析到的構(gòu)件版本是時(shí)間戳格式的快照,則復(fù)制其時(shí)間戳格式的文件 至 非時(shí)間戳格式,并使用該非時(shí)間戳格式的構(gòu)件
注:一定要記得<release> <enabled> & <snapshot> <enabled> ,對(duì)于快照也是一樣
在POM的依賴(lài)聲明的時(shí)候不推薦使用LATEST & RELEASE, 在Maven3中也不再支持在插件配置中使用LATEST & RELEASE, 如果不設(shè)置插件版本,那么最終版本和release一樣,
maven只會(huì)解析最新的發(fā)布版本構(gòu)建。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot中的WebSocketMessageBrokerConfigurer接口使用
在SpringBoot中,我們可以使用 WebSocketMessageBrokerConfigurer接口來(lái)配置WebSocket消息代理,以實(shí)現(xiàn)實(shí)時(shí)通信,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Vue中computed計(jì)算屬性和data數(shù)據(jù)獲取方式
這篇文章主要介紹了Vue中computed計(jì)算屬性和data數(shù)據(jù)獲取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot配置Spring Native的詳細(xì)步驟
配置 Spring Native 以減少 Spring Boot 應(yīng)用的啟動(dòng)時(shí)間,涉及幾個(gè)關(guān)鍵步驟,包括設(shè)置相應(yīng)的依賴(lài)、配置文件以及構(gòu)建過(guò)程,本文給大家就介紹了詳細(xì)的步驟和配置示例,需要的朋友可以參考下2024-11-11SpringCloud如何使用Eureka實(shí)現(xiàn)服務(wù)之間的傳遞數(shù)據(jù)
這篇文章主要介紹了SpringCloud使用Eureka實(shí)現(xiàn)服務(wù)之間的傳遞數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06java實(shí)現(xiàn)批量導(dǎo)入.csv文件到mysql數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)批量導(dǎo)入.csv文件到mysql數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Java中實(shí)現(xiàn)代碼優(yōu)化的技巧分享
這篇文章主要跟大家談?wù)剝?yōu)化這個(gè)話題,那么我們一起聊聊Java中如何實(shí)現(xiàn)代碼優(yōu)化這個(gè)問(wèn)題,小編這里有幾個(gè)實(shí)用的小技巧分享給大家,需要的可以參考一下2022-08-08Java中ArrayList具體實(shí)現(xiàn)之簡(jiǎn)單的洗牌算法
這篇文章主要給大家介紹了Java中ArrayList具體實(shí)現(xiàn)之簡(jiǎn)單的洗牌算法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-12-12mybatis框架之mybatis中dao層開(kāi)發(fā)的兩種方法
這篇文章主要介紹了mybatis框架之mybatis中dao層開(kāi)發(fā)的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07