網上有很多關于maven項目中mirror、profile、repository的搜尋順序的文章,說法不一。官方文檔并沒有找到相關的說明,鑒于此,我抽時間做了一個驗證。
依賴倉庫的配置方式
maven項目使用的倉庫一共有如下幾種方式:
- 中央倉庫,這是預設的倉庫
- 鏡像倉庫,通過 sttings.xml 中的 settings.mirrors.mirror 配置
- 全局profile倉庫,通過 settings.xml 中的 settings.repositories.repository 配置
- 項目倉庫,通過 pom.xml 中的 project.repositories.repository 配置
- 項目profile倉庫,通過 pom.xml 中的 project.profiles.profile.repositories.repository 配置
- 本地倉庫
如果所有配置都存在,依賴的搜尋順序就會變得異常複雜。
分析依賴搜尋順序
先從最簡單開始,慢慢增加配置,檢視有什麼變化。
準備測試環境
安裝jdk、maven。
使用如下指令建立測試項目:
yes | mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=true -DgroupId=com.pollyduan -DartifactId=myweb -Dversion=1.0 -Dpackage=com.pollyduan
建立完成後,為了避免後續測試幹擾,先執行一次compile。
cd myweb
mvn compile
最後,修改 pom.xml 檔案,将 junit版本号改為 4.12 。我們要使用這個jar來測試依賴的搜尋順序。
預設情況
首先確定junit4.12不存在:
rm -rf ~/.m2/repository/junit/junit/4.12
預設情況下沒有配置任何倉庫,也就是說,既沒改 $M2_HOME/conf/settings.xml 也沒有添加 ~/.m2/settings.xml
執行編譯,檢視日志中拉取junit的倉庫。
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)
- 可以看出,預設是從 central 中央倉庫拉取的jar.
配置鏡像倉庫 settings_mirror
建立 ~/.m2/setttings.xml ,内容如下:
<settings>
<mirrors>
<mirror>
<id>settings_mirror</id>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
重新測試:
rm -rf ~/.m2/repository/junit/junit/4.12
mvn compile
在日志中檢視下載下傳依賴的倉庫:
Downloaded from settings_mirror: https://maven.aliyun.com/repository/public/junit/junit/4.12/junit-4.12.pom (24 kB at 35 kB/s)
- 可以看出,是從 settings_mirror 中下載下傳的jar
- 結論:settings_mirror 的優先級高于 central
配置pom中的倉庫 pom_repositories
在 project 中增加如下配置:
<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的名字,是以倉庫位址無所謂,使用相同的位址也不影響測試。
執行測試:
rm -rf ~/.m2/repository/junit/junit/4.12
mvn compile
Downloaded from pom_repositories: http://10.18.29.128/nexus/content/groups/public/junit/junit/4.12/junit-4.12.pom (24 kB at 95 kB/s)
從顯示的倉庫id可以看出:
- jar 是從 pom_repositories 中下載下傳的。
- pom_repositories 優先級高于 settings_mirror
配置全局profile倉庫 settings_profile_repo
在 ~/.m2/settings.xml 中 settings 的節點内增加:
<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>
rm -rf ~/.m2/repository/junit/junit/4.12
mvn compile -Ps_profile
Downloaded from settings_profile_repo: http://mirrors.163.com/maven/repository/maven-public/junit/junit/4.12/junit-4.12.pom (24 kB at 63 kB/s)
- jar 是從 settings_profile_repo 中下載下傳的。
- settings_profile_repo 優先級高于 settings_mirror。
- settings_profile_repo 優先級高于 pom_repositories 。
配置項目profile倉庫 pom_profile_repo
<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>
rm -rf ~/.m2/repository/junit/junit/4.12
mvn compile -Ps_profile,p_profile
mvn compile -Pp_profile,s_profile
Downloaded from settings_profile_repo: http://mirrors.163.com/maven/repository/maven-public/junit/junit/4.12/junit-4.12.pom (24 kB at 68 kB/s)
- jar 是從 settings_profile_repo 中下載下傳的
- settings_profile_repo 優先級高于 pom_profile_repo
進一步測試:
rm -rf ~/.m2/repository/junit/junit/4.12
mvn compile -Pp_profile
Downloaded from pom_profile_repo: http://10.18.29.128/nexus/content/groups/public/junit/junit/4.12/junit-4.12.pom (24 kB at 106 kB/s)
- pom_profile_repo 優先級高于 pom_repositories
最後确認 local_repo 本地倉庫 ~/.m2/repository
這不算測試了,隻是一個結論,可以任意測試。
- 隻要
中包含依賴,無論怎麼配置,都會優先使用local本地倉庫中的jar.~/.m2/repository
最終結論
- settings_mirror 的優先級高于 central
- settings_profile_repo 優先級高于 settings_mirror
- settings_profile_repo 優先級高于 pom_repositories
通過上面的比較得出完整的搜尋鍊:
local_repo > settings_profile_repo > pom_profile_repo > pom_repositories > settings_mirror > central