天天看點

Maven 項目中依賴的搜尋順序

網上有很多關于maven項目中mirror、profile、repository的搜尋順序的文章,說法不一。官方文檔并沒有找到相關的說明,鑒于此,我抽時間做了一個驗證。

依賴倉庫的配置方式

maven項目使用的倉庫一共有如下幾種方式:

  1. 中央倉庫,這是預設的倉庫
  2. 鏡像倉庫,通過 sttings.xml 中的 settings.mirrors.mirror 配置
  3. 全局profile倉庫,通過 settings.xml 中的 settings.repositories.repository 配置
  4. 項目倉庫,通過 pom.xml 中的 project.repositories.repository 配置
  5. 項目profile倉庫,通過 pom.xml 中的 project.profiles.profile.repositories.repository 配置
  6. 本地倉庫

如果所有配置都存在,依賴的搜尋順序就會變得異常複雜。

分析依賴搜尋順序

先從最簡單開始,慢慢增加配置,檢視有什麼變化。

準備測試環境

安裝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

這不算測試了,隻是一個結論,可以任意測試。

  • 隻要

    ~/.m2/repository

    中包含依賴,無論怎麼配置,都會優先使用local本地倉庫中的jar.

最終結論

  • 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