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)

從顯示的倉庫id可以看出:

  • 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)

從顯示的倉庫id可以看出:

  • 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)

從顯示的倉庫id可以看出:

  • jar 是從 settings_profile_repo 中下載的
  • 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
  • settings_profile_repo 優先級高於 pom_profile_repo
  • pom_profile_repo 優先級高於 pom_repositories
  • pom_repositories 優先級高於 settings_mirror

通過上面的比較得出完整的搜索鏈:

local_repo > settings_profile_repo > pom_profile_repo > pom_repositories > settings_mirror > central

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章