1. 程式人生 > >在Maven中,倉庫就是存放依賴和外掛的地方

在Maven中,倉庫就是存放依賴和外掛的地方

在Maven中,任何一個依賴、外掛或者專案構建的輸出,都可以稱之為構件。

Maven在某個統一的位置儲存所有專案的共享的構件,這個統一的位置,我們就稱之為倉庫。(倉庫就是存放依賴和外掛的地方)

任何的構件都有唯一的座標,Maven根據這個座標定義了構件在倉庫中的唯一儲存路徑,

解讀Maven在倉庫中的儲存路徑:

1.基於groupId準備路徑,將句點分隔符轉成路徑分隔符,就是將  "."  轉換成 "/" ; example: org.testng --->org/testng

2.基於artifactId準備路徑,將artifactId連線到後面:org/testng/testng

3.使用version準備路徑,將version連線到後面:org/testng/testng/5.8

4.將artifactId於version以分隔符連字號連線到後面:org/testng/testng/5.8/tesng-5.8

5.判斷如果構件有classifier,就要在 第4項 後增加 分隔符連字號 再加上 classifier,org/testng/testng/5.8/tesng-5.8-jdk5

6.檢查構件的extension,如果extension存在,則加上句點分隔符和extension,而extension是由packing決定的,org/testng/testng/5.8/tesng-5.8-jdk5.jar

到這裡我們就明白了Maven 對於構件儲存的細節。

Maven 倉庫的分類:

maven的倉庫只有兩大類:1.本地倉庫 2.遠端倉庫,在遠端倉庫中又分成了3種:2.1 中央倉庫 2.2 私服 2.3 其它公共庫

1.本地倉庫,顧名思義,就是Maven在本地儲存構件的地方。

注:maven的本地倉庫,在安裝maven後並不會建立,它是在第一次執行maven命令的時候才被建立

maven本地倉庫的預設位置:無論是Windows還是Linux,在使用者的目錄下都有一個.m2/repository/的倉庫目錄,這就是Maven倉庫的預設位置

如何更改maven預設的本地倉庫的位置:這裡要引入一個新的元素:localRepository,它是存在於maven的settings.xml檔案中

1.1 更改配置使用者範圍的本地倉庫:先在/.m2/目錄下建立settings.xml檔案,然後在~/.m2/settings.xml,設定localRepository元素的值為想要的倉庫地址

  1. <settings>
  2.     <localRepository>D:\maven_new_repository</localRepository>
  3. </settings>
這時候,maven的本地倉庫地址就變成了 D:\maven_new_repository ,注:此時配置的maven的本地倉庫是屬於使用者範圍的。

1.2 更改配置全域性範圍的本地倉庫:在M2_HOME/conf/settings.xml中更改配置,更改配置的方法同上

注:此時更改後,所有的使用者都會受到影響,而且如果maven進行升級,那麼所有的配置都會被清除,所以要提前複製和備份M2_HOME/conf/settings.xml檔案

故:一般情況下不推薦配置全域性的settings.xml

2. 遠端倉庫

2.1 說到遠端倉庫先從 最核心的中央倉庫開始,中央倉庫是預設的遠端倉庫,maven在安裝的時候,自帶的就是中央倉庫的配置

在maven的聚合與繼承中我們說過,所有的maven專案都會繼承超級pom,具體的說,包含了下面配置的pom我們就稱之為超級pom

  1. <repositories>
  2.     <repository>
  3.       <id>central</id>
  4.       <name>Central Repository</name>
  5.       <url>http://repo.maven.apache.org/maven2</url>
  6.       <layout>default</layout>
  7.       <snapshots>
  8.         <enabled>false</enabled>
  9.       </snapshots>
  10.     </repository>
  11.   </repositories>
中央倉庫包含了絕大多數流行的開源Java構件,以及原始碼、作者資訊、SCM、資訊、許可證資訊等。一般來說,簡單的Java專案依賴的構件都可以在這裡下載到

2.2 私服

私服是一種特殊的遠端倉庫,它是架設在區域網內的倉庫服務,私服代理廣域網上的遠端倉庫,供區域網內的Maven使用者使用。當Maven需要下載構件的時候,它從私服請求,如果私服上不存在該構件,則從外部的遠端倉庫下載,快取在私服上之後,再為Maven的下載請求提供服務。我們還可以把一些無法從外部倉庫下載到的構件上傳到私服上。

Maven私服的 個特性:

1.節省自己的外網頻寬:減少重複請求造成的外網頻寬消耗

2.加速Maven構件:如果專案配置了很多外部遠端倉庫的時候,構建速度就會大大降低

3.部署第三方構件:有些構件無法從外部倉庫獲得的時候,我們可以把這些構件部署到內部倉庫(私服)中,供內部maven專案使用

4.提高穩定性,增強控制:Internet不穩定的時候,maven構建也會變的不穩定,一些私服軟體還提供了其他的功能

5.降低中央倉庫的負荷:maven中央倉庫被請求的數量是巨大的,配置私服也可以大大降低中央倉庫的壓力

當前主流的maven私服:

1.Apache的Archiva

2.JFrog的Artifactory

3.Sonatype的Nexus

三、遠端倉庫配置

配置遠端倉庫將引入新的配置元素:<repositories>     <repository>

<repositories>元素下,可以使用  <repository>子元素宣告一個或者多個遠端倉庫。

例子:

  1. <repositories>
  2.         <repository>
  3.             <id>jboss</id>
  4.             <name>JBoss Repository</name>
  5.             <url>http://repository.jboss.com/maven2/</url>
  6.             <releases>
  7.                 <updatePolicy>daily</updatePolicy><!-- never,always,interval n -->
  8.                 <enabled>true</enabled>
  9.                 <checksumPolicy>warn</checksumPolicy><!-- fail,ignore -->
  10.             </releases>
  11.             <snapshots>
  12.                 <enabled>false</enabled>
  13.             </snapshots>
  14.             <layout>default</layout>
  15.         </repository>
  16.     </repositories>
<updatePolicy>元素:表示更新的頻率,值有:never, always,interval,daily, daily 為預設值

<checksumPolicy>元素:表示maven檢查和檢驗檔案的策略,warn為預設值

出於安全方面的考慮,有時我們要對遠端倉庫的訪問進行認證,一般將認證資訊配置在settings.xml中:

  1. <spanstyle="white-space:pre"></span><servers>
  2.         <server>
  3.             <id>same with repository id in pom</id>
  4.             <username>username</username>
  5.             <password>pwd</password>
  6.         </server>
  7.     </servers>
注:這裡的id必須與POM中需要認證的repository元素的Id一致。

如何將生成的專案部署到遠端倉庫

完成這項工作,也需要在POM中進行配置,這裡有新引入了一個元素:<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只會解析最新的釋出版本構建。