網(wǎng)上有很多關(guān)于maven項(xiàng)目中mirror、profile、repository的搜索順序的文章,說法不一。官方文檔并沒有找到相關(guān)的說明,鑒于此,我抽時(shí)間做了一個(gè)驗(yàn)證。
依賴倉(cāng)庫(kù)的配置方式
maven項(xiàng)目使用的倉(cāng)庫(kù)一共有如下幾種方式:
- 中央倉(cāng)庫(kù),這是默認(rèn)的倉(cāng)庫(kù)
- 鏡像倉(cāng)庫(kù),通過 sttings.xml 中的 settings.mirrors.mirror 配置
- 全局profile倉(cāng)庫(kù),通過 settings.xml 中的 settings.repositories.repository 配置
- 項(xiàng)目倉(cāng)庫(kù),通過 pom.xml 中的 project.repositories.repository 配置
- 項(xiàng)目profile倉(cāng)庫(kù),通過 pom.xml 中的 project.profiles.profile.repositories.repository 配置
- 本地倉(cāng)庫(kù)
如果所有配置都存在,依賴的搜索順序就會(huì)變得異常復(fù)雜。
分析依賴搜索順序
先從最簡(jiǎn)單開始,慢慢增加配置,查看有什么變化。
準(zhǔn)備測(cè)試環(huán)境
安裝jdk、maven。
使用如下命令創(chuàng)建測(cè)試項(xiàng)目:
創(chuàng)建完成后,為了避免后續(xù)測(cè)試干擾,先執(zhí)行一次compile。
1
2
|
cd myweb mvn compile |
最后,修改 pom.xml 文件,將 junit版本號(hào)改為 4.12 。我們要使用這個(gè)jar來測(cè)試依賴的搜索順序。
默認(rèn)情況
首先確保junit4.12不存在:
1
|
rm -rf ~/.m2/repository/junit/junit/ 4.12 |
默認(rèn)情況下沒有配置任何倉(cāng)庫(kù),也就是說,既沒改 $m2_home/conf/settings.xml 也沒有添加 ~/.m2/settings.xml
執(zhí)行編譯,查看日志中拉取junit的倉(cāng)庫(kù)。
1
2
3
4
|
mvn compile ... downloaded from central: https: //repo.maven.apache.org/maven2/junit/junit/4.12/junit-4.12.pom (24 kb at 11 kb/s) |
可以看出,默認(rèn)是從 central 中央倉(cāng)庫(kù)拉取的jar.
配置鏡像倉(cāng)庫(kù) settings_mirror
創(chuàng)建 ~/.m2/setttings.xml ,內(nèi)容如下:
1
2
3
4
5
6
7
8
9
|
<settings> <mirrors> <mirror> <id>settings_mirror</id> <url>https: //maven.aliyun.com/repository/public</url> <mirrorof>central</mirrorof> </mirror> </mirrors> </settings> |
重新測(cè)試:
1
2
|
rm -rf ~/.m2/repository/junit/junit/ 4.12 mvn compile |
在日志中查看下載依賴的倉(cāng)庫(kù):
可以看出,是從 settings_mirror 中下載的jar
結(jié)論:settings_mirror 的優(yōu)先級(jí)高于 central
配置pom中的倉(cāng)庫(kù) pom_repositories
在 project 中增加如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<repositories> <repository> <id>pom_repositories</id> <name>local</name> <url>http: //10.18.29.128/nexus/content/groups/public/</url> <releases> <enabled> true </enabled> </releases> <snapshots> <enabled> true </enabled> </snapshots> </repository> </repositories> |
由于我們改變了id的名字,所以倉(cāng)庫(kù)地址無所謂,使用相同的地址也不影響測(cè)試。
執(zhí)行測(cè)試:
1
2
|
rm -rf ~/.m2/repository/junit/junit/ 4.12 mvn compile |
在日志中查看下載依賴的倉(cāng)庫(kù):
從顯示的倉(cāng)庫(kù)id可以看出:
- jar 是從 pom_repositories 中下載的。
- pom_repositories 優(yōu)先級(jí)高于 settings_mirror
配置全局profile倉(cāng)庫(kù) settings_profile_repo
在 ~/.m2/settings.xml 中 settings 的節(jié)點(diǎn)內(nèi)增加:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<profiles> <profile> <id>s_profile</id> <repositories> <repository> <id>settings_profile_repo</id> <name>netease</name> <url>http: //mirrors.163.com/maven/repository/maven-public/</url> <releases> <enabled> true </enabled> </releases> <snapshots> <enabled> true </enabled> </snapshots> </repository> </repositories> </profile> </profiles> |
執(zhí)行測(cè)試:
1
2
|
rm -rf ~/.m2/repository/junit/junit/ 4.12 mvn compile -ps_profile |
在日志中查看下載依賴的倉(cāng)庫(kù):
從顯示的倉(cāng)庫(kù)id可以看出:
- jar 是從 settings_profile_repo 中下載的。
- settings_profile_repo 優(yōu)先級(jí)高于 settings_mirror。
- settings_profile_repo 優(yōu)先級(jí)高于 pom_repositories 。
配置項(xiàng)目profile倉(cāng)庫(kù) pom_profile_repo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<profiles> <profile> <id>p_profile</id> <repositories> <repository> <id>pom_profile_repo</id> <name>local</name> <url>http: //10.18.29.128/nexus/content/groups/public/</url> <releases> <enabled> true </enabled> </releases> <snapshots> <enabled> true </enabled> </snapshots> </repository> </repositories> </profile> </profiles> |
執(zhí)行測(cè)試:
1
2
3
|
rm -rf ~/.m2/repository/junit/junit/ 4.12 mvn compile -ps_profile,p_profile mvn compile -pp_profile,s_profile |
在日志中查看下載依賴的倉(cāng)庫(kù):
從顯示的倉(cāng)庫(kù)id可以看出:
- jar 是從 settings_profile_repo 中下載的
- settings_profile_repo 優(yōu)先級(jí)高于 pom_profile_repo
進(jìn)一步測(cè)試:
1
2
|
rm -rf ~/.m2/repository/junit/junit/ 4.12 mvn compile -pp_profile |
在日志中查看下載依賴的倉(cāng)庫(kù):
從顯示的倉(cāng)庫(kù)id可以看出:
- jar 是從 settings_profile_repo 中下載的
- pom_profile_repo 優(yōu)先級(jí)高于 pom_repositories
最后確認(rèn) local_repo 本地倉(cāng)庫(kù) ~/.m2/repository
這不算測(cè)試了,只是一個(gè)結(jié)論,可以任意測(cè)試。
只要 ~/.m2/repository 中包含依賴,無論怎么配置,都會(huì)優(yōu)先使用local本地倉(cāng)庫(kù)中的jar.
最終結(jié)論
- settings_mirror 的優(yōu)先級(jí)高于 central
- settings_profile_repo 優(yōu)先級(jí)高于 settings_mirror
- settings_profile_repo 優(yōu)先級(jí)高于 pom_repositories
- settings_profile_repo 優(yōu)先級(jí)高于 pom_profile_repo
- pom_profile_repo 優(yōu)先級(jí)高于 pom_repositories
- pom_repositories 優(yōu)先級(jí)高于 settings_mirror
通過上面的比較得出完整的搜索鏈:
local_repo > settings_profile_repo > pom_profile_repo > pom_repositories > settings_mirror > central
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://my.oschina.net/polly/blog/2120650