1. 前言
maven
是作為Javer
日常開發中必不可少的工具,但是很多人對於它的使用也只是僅限於的幾個功能。
前幾天在使用一個依賴總是說找不到該依賴,但是在中央倉庫中的確存在該構建。這個問題讓我很困惑,突然發現對於maven這個優秀構建工具的使用也只是浮於表面。痛定思痛,於是就有了這篇簡短的總結。
對於maven依賴順序的搜索,網上眾說紛紜,那么真相到底是怎么樣的呢?
2. 准備
根據我們的開發經驗,使用maven可以配置多個倉庫,先來看看我們最熟悉的一個。
打開我們的settings.xml文件,一開始是一個最純潔的配置文件:
可以看到,只是配置了一個鏡像地址和一個本地倉庫的路徑,這也是我們第一次使用maven時大多數教程中會提到的一點-修改mirror為國內的一個地址。
現在我們創建一個maven的工程,然后看看它的依賴查找順序是怎樣的?
我創建了一個mvn-dep
文件夾,在這里面創建項目所需要的文件,為了簡單,我就使用maven cli來搭建一個簡單的項目,使用的命令如下:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=true -DgroupId=com.watertreestar -DartifactId=mvn-dep -Dversion=1.0 -Dpackage=com.watertreestar
創建好以后我們的項目結構如下:
接下來看一下不同的配置下依賴查找的路徑
3. 依賴查找探索
使用上一步創建的項目,並在上面的基礎settings.xml配置文件上做修改,觀察依賴查找的優先級。
在操作之前,我們在項目的pom.xml中已經包含了一個依賴就是fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
我們先確保本地倉庫中該版本的junit不存在,使用rm
命令來刪除它:
rm -rf ~/.m2/repository/com/alibaba/fastjson
3.1 不修改的情況
我們使用上面的setings.xml文件,不做任何修改,執行mvn compile
命令,輸出如下:
可以看出,maven是從我們配置的central鏡像-阿里雲鏡像中拉取依賴
3.2 沒有配置中央倉庫鏡像
現在我們把settings文件中的mirror配置刪除,就成了一個光禿禿的配置:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups></pluginGroups>
<proxies></proxies>
<localRepository>/Users/young/.m2/repository</localRepository>
</settings>
這種情況下,依賴會從哪兒獲取呢
可以看到,是從默認的中央倉庫中查找和下載依賴。
根據上面的結果可以看到優先級:
特定倉庫reporitory的鏡像mirror > settings中配置的倉庫repository
3.3 項目配置倉庫repository
- 現在我們把倉庫的配置還原到最初的狀態,如下:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups></pluginGroups>
<proxies></proxies>
<localRepository>/Users/young/.m2/repository</localRepository>
<mirrors>
<mirror>
<id>settings-mirror</id>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
-
然后在第二節中創建的項目pom.xml文件中添加一個repository配置,我們使用了一個sonatype的maven倉庫
當前的
項目pom.xml配置
如下:
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>pom_repository</id>
<name>sonatype</name>
<url>https://repository.sonatype.org/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
執行mvn compile
命令,輸出如下:
可以看出依賴從項目pom.xml配置的pom-repository倉庫中查找並下載。
3.4 配置全局profile中的repository
在maven配置文件settings.xml中增加profile配置
使用maven compile -Psettings-profile
可以看出,依賴從settings.xml中我們配置settings-profile的repository中下載的
settings_profile_repository > pom_repositories
3.5 配置項目profile的repository
3.5.1 激活pom中的profile和setting中的profile
全局settings.xml中的配置不見,在pom.xml中增加profile配置:
<profiles>
<profile>
<id>pom-profile</id>
<repositories>
<repository>
<id>pom-profile-repository</id>
<name>maven2</name>
<url>https://repo.maven.apache.org/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
刪除本地倉庫的fastjson依賴,然后執行mvn compile -Psettings-profile,pom-profile
輸出:
我們同時激活了settings-profile和pom-profile,但是最終依賴的下載是從settings-profile中配置的倉庫下載的。
settings-profile > pom-profile
3.5.2 只是激活pom中的profile
假如只是激活pom中的profile,也就是使用mvn compile -Ppom-profile
,輸出結果如下:
可以看出,最終依賴的下載是從pom中配置的profile-repository中下載的
pom-profile-repository > pom-repository
3.6 local repository
由於之前的步驟中我們已經下載jar到了local倉庫,為了測試最后一步,我們就不用在執行rm -rf ~/.m2/repository/com/alibaba/fastjson
來刪除本地的依賴了。
我這里使用了 mvn compile -Ppom-profile
來做測試,輸出的結果如下:
可以看到,沒有從任何遠程倉庫中下載依賴
local > 所有遠程倉庫
4. 總結
從上面一系列的驗證中可以總結出依賴查找的優先級:
local-repo > settings-profile-repository > pom-profile-repository > pom-repository > central
理解maven查找的優先級,可以幫助我們在工作和學習中解決一些依賴找不到的錯誤。
最后,推薦幾個可以使用的maven倉庫: