Maven中的庫(repository)詳解

Maven中的庫(repository)是構件(artifact)的集合。構件以一定的佈局存儲在庫中。

Maven中的庫(repository)可以分爲本地庫和遠程庫。本地庫在安裝Maven的計算機上的指定路徑下(通常是用戶主目錄下的.m2/repository),本地庫中的構件往往是遠程庫中下載到本地的部分構件,被本地項目所引用。當然,本地項目發佈時,默認也發佈到本地庫中。遠程庫往往是由第三方提供的,用於發佈構件供項目下載使用,如著名的Maven central庫。

根據構件的用途,構件可以分爲兩類,一類是被其他構件依賴的構件(dependencies),這也是Maven庫中主要的構件。另一類是插件(plugins),這是一種特殊的構件。對於依賴的構件,其所在的庫通過<repositories>設置。但是對於插件的構件,由於插件的特殊性,所以插件庫獨立於依賴庫,使用<pluginRepositories>單獨設置。但是由於依賴和插件都屬於構件,所以<repositories>和<pluginRepositories>中的設置基本一致。

如果一個項目需要依賴一個構件,Maven編譯的時候會首先從本地庫查找該構件。如果本地庫中沒有,再根據配置的遠程庫信息,逐個去遠程庫中查找該構件。

 

如果在遠程庫中找到則下載到本地庫,如果在所有的遠程庫中都沒有則會拋出編譯異常。

Maven中要配置庫,可以有多種方式。最直接的是在項目中的pom.xml文件中,通過<repositories>配置庫,這樣配置的庫僅適用於當前項目。也可以通過<profiles>中的<repositories>配置在特定環境下的特殊庫,這可以在項目的pom.xml文件中實現,也可以在Maven的settings.xml中實現。

此外,一個項目發佈後,其往往要被部署到一個庫中,作爲庫的構件以供其他項目引用。通過<distributionManagement>中的<repositories>配置要發佈的庫。

1. 在pom.xml或settings.xml中設置<repositories>,往往需要提供一個<repository>的如下信息:

  • id,庫的ID
  • name,庫的名稱
  • url,庫的URL
  • layout,在Maven 2/3中都是default,只有在Maven 1.x中才是legacy
  • releases,庫中版本爲releases的構件
  • snapshots,庫中版本爲snapshots的構件

 

根據構件的版本,可以將構件分爲releases類型的構件和snapshots類型的構件。

對於一個構件,其版本的變化是否會引起庫中更新該構件呢?則需要根據庫的<releases>或<snapshots>設置。<releases>和<snapshots>的設置參數一致,如下所示:

 

  • enabled,是否支持更新
  • updatePolicy,構件更新的策略,可選值有daily, always, never, interval:X(其中的X是一個數字,表示間隔的時間,單位min),默認爲daily
  • checksumPolicy,校驗碼異常的策略,可選值有ignore, fail, warn

 

在pom.xml中定義<repository>的示例如下:

 

[html] view plain copy
  1. <repositories>  
  2.   <repository>  
  3.     <releases>  
  4.       <enabled>false</enabled>  
  5.       <updatePolicy>always</updatePolicy>  
  6.       <checksumPolicy>warn</checksumPolicy>  
  7.     </releases>  
  8.     <snapshots>  
  9.       <enabled>true</enabled>  
  10.       <updatePolicy>never</updatePolicy>  
  11.       <checksumPolicy>fail</checksumPolicy>  
  12.     </snapshots>  
  13.     <id>codehausSnapshots</id>  
  14.     <name>Codehaus Snapshots</name>  
  15.     <url>https://repository-master.mulesoft.org/nexus/content/groups/public/</span></url>  
  16.     <layout>default</layout>  
  17.   </repository>  
  18. </repositories>  


 

2.在pom.xml中的<distributionManagement>,負責管理構件的發佈包和其他編譯生成的支撐文件。

在<distributionManagement>中也可以配置一個<repository>。這裏的<repository>給出的是當前項目部署後所發佈的庫,示例如下:

 

[html] view plain copy
  1. <distributionManagement>  
  2.   <repository>  
  3.     <uniqueVersion>false</uniqueVersion>  
  4.     <id>corp1</id>  
  5.     <name>Corporate Repository</name>  
  6.     <url>scp://repo/maven2</url>  
  7.     <layout>default</layout>  
  8.   </repository>  
  9.   <snapshotRepository>  
  10.     <uniqueVersion>true</uniqueVersion>  
  11.     <id>propSnap</id>  
  12.     <name>Propellors Snapshots</name>  
  13.     <url>sftp://propellers.net/maven</url>  
  14.     <layout>legacy</layout>  
  15.   </snapshotRepository>  
  16.   ...  
  17. </distributionManagement>  
該<repository>的url是當前Maven項目的構件所發佈的地址(但是注意,未必是訪問該構件的地址)。

 

 

<distributionManagement>中還可以配置一個<snapshotRepository>,表示開發過程中的發佈庫。<snapshotRepository>的設置與<repository>一樣。如果沒有設置<snapshotRepository>,還可以將<repository>用作<snapshotRepository>。

關於<distributionManagement>的具體用法參見後續文章。

 

3.在pom.xml或settings.xml中的<profile>中都可以設置<repositories>或<pluginRepositories>其中的<repository>設置與在<profile>外設置<repositories>中的<repository>一樣。

<profile>中的<repositories>表示在該<profile>環境中所特有的庫。

關於<profile>的具體用法參見後續文章。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章