Maven依賴,去哪兒找


1. 前言

maven是作為Javer日常開發中必不可少的工具,但是很多人對於它的使用也只是僅限於的幾個功能。

前幾天在使用一個依賴總是說找不到該依賴,但是在中央倉庫中的確存在該構建。這個問題讓我很困惑,突然發現對於maven這個優秀構建工具的使用也只是浮於表面。痛定思痛,於是就有了這篇簡短的總結。

對於maven依賴順序的搜索,網上眾說紛紜,那么真相到底是怎么樣的呢?

2. 准備

根據我們的開發經驗,使用maven可以配置多個倉庫,先來看看我們最熟悉的一個。

打開我們的settings.xml文件,一開始是一個最純潔的配置文件:

image-20210826221331089

可以看到,只是配置了一個鏡像地址和一個本地倉庫的路徑,這也是我們第一次使用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命令,輸出如下:

image-20210829143616546

可以看出,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>

這種情況下,依賴會從哪兒獲取呢

image-20210829143812267

可以看到,是從默認的中央倉庫中查找和下載依賴。

根據上面的結果可以看到優先級:

特定倉庫reporitory的鏡像mirror > settings中配置的倉庫repository

3.3 項目配置倉庫repository

  1. 現在我們把倉庫的配置還原到最初的狀態,如下:
<?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>

  1. 然后在第二節中創建的項目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配置

image-20210826235027569

使用maven compile -Psettings-profile

image-20210829151813952

可以看出,依賴從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

輸出:

image-20210829153530950

我們同時激活了settings-profile和pom-profile,但是最終依賴的下載是從settings-profile中配置的倉庫下載的。

settings-profile > pom-profile

3.5.2 只是激活pom中的profile

假如只是激活pom中的profile,也就是使用mvn compile -Ppom-profile,輸出結果如下:

image-20210829153952948

可以看出,最終依賴的下載是從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來做測試,輸出的結果如下:

image-20210829154538769

可以看到,沒有從任何遠程倉庫中下載依賴

local > 所有遠程倉庫

4. 總結

從上面一系列的驗證中可以總結出依賴查找的優先級:

local-repo > settings-profile-repository > pom-profile-repository > pom-repository > central

理解maven查找的優先級,可以幫助我們在工作和學習中解決一些依賴找不到的錯誤。

最后,推薦幾個可以使用的maven倉庫:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM