Maven之本地倉庫,遠端倉庫
在Maven中,任何一個依賴、外掛或者專案構建的輸出,都可以稱之為構件。
Maven在某個統一的位置儲存所有專案的共享的構件,這個統一的位置,我們就稱之為倉庫。(倉庫就是存放依賴和外掛的地方)
任何一個構件都有一個座標作為唯一的標識。
這個座標就是:group、artifactId、version;根據這個座標就可以定義其在倉庫的唯一儲存路徑,那麼就可以在專案中引用。
解讀Maven在倉庫中的儲存路徑:
<groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2.8.RELEASE</version>
1.基於groupId準備路徑,將句點分隔符轉成路徑分隔符,就是將
"." 轉換成 "/"
2.基於artifactId準備路徑,將artifactId連線到後面:org/springframework/spring-core
3.使用version準備路徑,將version連線到後面:org/springframework/spring-core/3.2.8.RELEASE
最後jar包的名字其實就是: artificialId+version.jar
E:\soft\aabbccdd----這個目錄是我設定的本地倉庫路徑
Maven倉庫的分類:
maven的倉庫只有2大類:1.本地倉庫 2.遠端倉庫
遠端倉庫又包括了3種: 2.1中央倉庫 2.2 私服 2.3其他公共庫
1)本地倉庫就是我們自己機器上的檔案系統,所以他是唯一的,專案構建時首先在本地倉庫查詢依賴,如果本地沒有依賴時才會去尋找遠端倉庫。
2)遠端倉庫指的是非本地的其他所有倉庫,中央倉庫、私服等都是遠端倉庫的一種。如果本地倉庫沒有專案構建需要的構件,你們就會從遠端倉庫下載,可是遠端倉庫如果也沒有的話,你們就會專案報錯。
本地倉庫設定
<localRepository>E:/soft/aabbccdd</localRepository>
安裝的時候有一個conf/settings.xml檔案,這個檔案是全域性控制檔案,另外,還有一個就是C:\Users\電腦名\.m2 下面也會有一個settings.xml檔案,這個代表的是個人區域性配置檔案,然而,我們使用Eclipse預設採用這個settings.xml檔案,可以通過如下截圖修改:
中央倉庫
Maven必須知道至少一個可用的遠端倉庫,才能執行Maven命令的時候下載到需要的構件。中央倉庫就是這樣一個預設的遠端倉庫,中央倉庫包含了絕大多數流行的開源Java構件,以及原始碼、作者資訊、SCM、資訊、許可證資訊等。一般來說,簡單的Java專案依賴的構件都可以在這裡下載到.
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>always</checksumPolicy>
</snapshots>
</repository>
</repositories>
私服
私服是一種特殊的遠端倉庫,他是架設在區域網內的倉庫服務,私服代理廣域網上的遠端倉庫,供區域網內的Maven使用者使用。當Maven需要下載構件的時候,它從私服請求,如果私服上不存在改構件,則從外部的遠端倉庫下載,同時快取在私服之上,然後為Maven下載請求提供服務,另外,對於第三方的jar無法從倉庫下載(JDBC驅動)可以從本地上傳到私服供客戶端下載。
優點主要有:
1)節省外網寬頻
2)加速Maven構建
3)部署第三方構件
4)提高穩定性、增強控制:原因是外網不穩定
5)降低中央倉庫的負荷:原因是中央倉庫訪問量太大
當前主流的maven私服:1.Apache的Archiva
2.JFrog的Artifactory
3.Sonatype的Nexus
映象
遠端倉庫認證
<server>
<id>deploymentRepo_releases</id>
<username>aaa</username>
<password>pwd</password>
</server>
注:ID代表的是某個repository元素配置的ID,所以必須要一樣.遠端倉庫部署
<distributionManagement>
<repository>
<id>deploymentRepo_releases</id>
<name>Nexus Release Repository</name>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>deploymentRepo_snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
我們開發的版本可以通過 mvn deploy 把專案部署到對應的私服上去對於為什麼要把發行版本和快照版本分開主要還是為了方便後期專案維護和當時的協同開發。比如發行版本肯定是穩定版,但是他的功能可能沒有那麼多,對於一些要求穩定的客戶就可以給他發行版本;可是對於快照版本來說,是一個正在開發的版本,這個版本可能隨時都會被另外一個專案依賴,如果他需要我的功能我就會進行程式碼提交,也就是部署到私服上去,然而,這個時候Maven就會把我的快照版本做一個時間戳新增在快照版本之後,別人依賴的快照版本也會自動更新為最新的快照版本,這些都是Maven幫我們完成,我們只要專案提交就好。如何將生成的專案部署到遠端倉庫
完成這項工作,這裡有新引入了一個元素:<distributionManagement>
distributionManagement包含了2個子元素:repository和snapshotRepository, 前者表示釋出版本構件的倉庫,後者表示快照版本的倉庫
這兩個元素都需要配置 id(該遠端倉庫的唯一標識),name,url(表示該倉庫的地址)
向遠端倉庫中部署構件,需要進行認證。配置同上
配置正確後執行: mvn clean deploy
正確的看待快照
之前我們在配置pom的時候,對於快照的配置都很謹慎,或者說很少用快照的版本,原因是它還很不穩定,極容易給我們的系統帶來未知的錯誤,讓我們很難查詢。其實快照版本也並不是一無是處,快照最大的用途是用在開發的過程中,尤其是有模組依賴的時候,比如說AB兩個模組同時開發,A依賴於B,開發過程中AB都是持續整合的開發,不斷的修改POM檔案和構建工程,這時候版本同步就成了一個很大的問題。使用快照就可以達到這一目的。
其實在快照版本在釋出的過程中,Maven會自動為構件以當前時間戳做標記,有了這個時間戳,我們就可以隨時找到最新的快照版本,這樣也就解決剛才說的 協作開發的問題。
至於A如何檢查B的更新,剛剛在講配置的時候說過,快照配置中有一個元素可以控制檢查更新的頻率------updatePolicy
我們也可以使用命令列加引數的形式強制執行讓maven檢查更新:
mvn clean install-U
maven到底是如何從倉庫中解析構件的呢?----maven從倉庫解析依賴的機制
1. 當依賴的範圍是system的時候,Maven直接從本地檔案系統解析構件
2. 根據依賴座標計算倉庫路徑後,嘗試直接從本地倉庫尋找構件,如果發現相應構件,則解析成功
3. 在本地倉庫不存在相應的構件情況下,如果依賴的版本是顯示的釋出版本構件,則遍歷所有的遠端倉庫,發現後下載使用4. 如果依賴的版本是RELEASE或LATEST, 則基於更新策略讀取所有遠端倉庫的元資料,將其於本地倉庫的對應元資料合併後,計算出RELEASE或者LATEST的真實值,然後基於這個真實值檢查本地倉庫
5. 如果依賴的版本是SNAPSHOT, 則基於更新策略讀取所有遠端倉庫的元資料, 將其與本地倉庫的對應元資料合併後,得到最新快照版本的值,然後基於該值檢查本地倉庫或從遠端倉庫下載
6. 如果最後解析到的構件版本是時間戳格式的快照,則複製其時間戳格式的檔案 至 非時間戳格式,並使用該非時間戳格式的構件
注:一定要記得<release> <enabled>&<snapshot> <enabled> ,對於快照也是一樣,在POM的依賴宣告的時候不推薦使用LATEST & RELEASE, 在Maven3中也不再支援在外掛配置中使用LATEST & RELEASE, 如果不設定外掛版本,那麼最終版本和release一樣,
maven只會解析最新的釋出版本構建。
參考文章:https://my.oschina.net/heweipo/blog/480244
http://blog.csdn.net/xun_2008/article/details/16916801
http://blog.csdn.net/wanghantong/article/details/36427433