Maven中的庫(repository)是構件(artifact)的集合。構件以一定的佈局存儲在庫中。
Maven中的庫(repository)可以分爲本地庫和遠程庫。本地庫在安裝Maven的計算機上的指定路徑下(通常是用戶主目錄下的.m2/repository),本地庫中的構件往往是遠程庫中下載到本地的部分構件,被本地項目所引用。當然,本地項目發佈時,默認也發佈到本地庫中。遠程庫往往是由第三方提供的,用於發佈構件供項目下載使用,如著名的Maven central庫。
根據構件的用途,構件可以分爲兩類,一類是被其他構件依賴的構件(dependencies),這也是Maven庫中主要的構件。另一類是插件(plugins),這是一種特殊的構件。對於依賴的構件,其所在的庫通過<repositories>設置。但是對於插件的構件,由於插件的特殊性,所以插件庫獨立於依賴庫,使用<pluginRepositories>單獨設置。但是由於依賴和插件都屬於構件,所以<repositories>和<pluginRepositories>中的設置基本一致。
如果在遠程庫中找到則下載到本地庫,如果在所有的遠程庫中都沒有則會拋出編譯異常。
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>的示例如下:
- <repositories>
- <repository>
- <releases>
- <enabled>false</enabled>
- <updatePolicy>always</updatePolicy>
- <checksumPolicy>warn</checksumPolicy>
- </releases>
- <snapshots>
- <enabled>true</enabled>
- <updatePolicy>never</updatePolicy>
- <checksumPolicy>fail</checksumPolicy>
- </snapshots>
- <id>codehausSnapshots</id>
- <name>Codehaus Snapshots</name>
- <url>https://repository-master.mulesoft.org/nexus/content/groups/public/</span></url>
- <layout>default</layout>
- </repository>
- </repositories>
2.在pom.xml中的<distributionManagement>,負責管理構件的發佈包和其他編譯生成的支撐文件。
在<distributionManagement>中也可以配置一個<repository>。這裏的<repository>給出的是當前項目部署後所發佈的庫,示例如下:
- <distributionManagement>
- <repository>
- <uniqueVersion>false</uniqueVersion>
- <id>corp1</id>
- <name>Corporate Repository</name>
- <url>scp://repo/maven2</url>
- <layout>default</layout>
- </repository>
- <snapshotRepository>
- <uniqueVersion>true</uniqueVersion>
- <id>propSnap</id>
- <name>Propellors Snapshots</name>
- <url>sftp://propellers.net/maven</url>
- <layout>legacy</layout>
- </snapshotRepository>
- ...
- </distributionManagement>
<distributionManagement>中還可以配置一個<snapshotRepository>,表示開發過程中的發佈庫。<snapshotRepository>的設置與<repository>一樣。如果沒有設置<snapshotRepository>,還可以將<repository>用作<snapshotRepository>。
關於<distributionManagement>的具體用法參見後續文章。
3.在pom.xml或settings.xml中的<profile>中都可以設置<repositories>或<pluginRepositories>,其中的<repository>設置與在<profile>外設置<repositories>中的<repository>一樣。
<profile>中的<repositories>表示在該<profile>環境中所特有的庫。
關於<profile>的具體用法參見後續文章。