Maven倉庫 repository

Maven(三) 倉庫 repository

https://blog.csdn.net/u010811939/article/details/81110920

詳解maven的setting配置文件中mirror和repository的區別

https://www.jb51.net/article/152935.htm

 

1 倉庫

  1. 本地倉庫(.m2)
  2. 遠程倉庫(聯網)
  3. 遠程倉庫(私服)
  4. 使用鏡像

1.1 本地倉庫(.m2)

運行原理
運行Maven的時候,Maven所需要的任何構件都是直接從本地倉庫獲取的。如果本地倉庫沒有,它會首先嚐試從遠程倉庫下載構件至本地倉庫,然後再使用本地倉庫的構件。

示例說明
你的項目配置了junit-3.8的依賴,在你運行mvn test 的時候,Maven需要使用junit-3.8的jar文件,它首先根據座標查找本地倉庫,如果找到,就直接使用。如果沒有,Maven會檢查可用的遠程倉庫配置,然後逐個嘗試這些遠程倉庫去下載junit-3.8的jar文件,如果遠程倉庫存在該文件,Maven會將其下載到本地倉庫中,繼而使用。如果嘗試過所有遠程倉庫之後,Maven還是沒能夠下載到該文件,它就會報錯。

倉庫位置
1. 默認倉庫的存儲位置:

Maven缺省的本地倉庫路徑爲${user.home}/.m2/repository
這裏寫圖片描述
2. 自定義修改倉庫的存儲位置:

可改變默認的 .m2 目錄下的默認本地存儲庫文件夾
通過修改${user.home}/.m2/settings.xml 配置本地倉庫路徑 ,沒有settings這個xml文件就新建,或者如下複製個;具體看圖:
這裏寫圖片描述

<span style="color:#000000"><code><!-- localRepository  
 | The path to the local repository maven will use to store artifacts.  
 |  
 | Default: ${user.home}/.m2/repository-->  
<localRepository>D:/.m2/repository</localRepository>  
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5

3. 運行時指定本地倉庫位置:
mvn clean install -Dmaven.repo.local=/home/juven/myrepo/

還有一點需要理解的是,當我們運行install的時候,Maven實際上是將項目生成的構件安裝到了本地倉庫,也就是說,只有install了之後,其它項目才能使用此項目生成的構件。

遠程倉庫(聯網)

接着瞭解一下Maven缺省的遠程倉庫,即Maven中央倉庫:
運行原理
安裝好Maven之後,我們可以建立一個簡單的項目,配置一些簡單的依賴,然後運行mvn clean install,項目就構建好了。我們沒有手工的去下載任何jar文件,這一切都是因爲Maven中央倉庫的存在,當Maven在本地倉庫找不到需要的jar文件時,它會查找遠程倉庫,而一個原始的Maven安裝就自帶了一個遠程倉庫——Maven中央倉庫。

倉庫位置
這個Maven中央倉庫是在哪裏定義的呢?

  1. maven-2.xxx,可以找到這個文件:${M2_HOME}/lib/maven-2.0.10-uber.jar;
  2. maven-3.xxx版本之後,在maven可以找到這個文件:/lib/maven-model-builder- ${version}.jar中;

打開該文件,能找到超級POM:\org\apache\maven\model\pom-4.0.0.xml ,它是所有Maven POM的父POM,所有Maven項目繼承該配置,你可以在這個POM中發現如下配置:

<span style="color:#000000"><code><repositories>  
  <repository>  
    <id>central</id>  
    <name>Central Repository</name>  
    <url>https://repo.maven.apache.org/maven2</url>  
    <layout>default</layout>  
    <snapshots>  
      <enabled>false</enabled>  
    </snapshots>  
  </repository>  
</repositories> 
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

關於遠程倉庫的配置,下面的我會詳細解釋,這裏我們只要知道,中央倉庫的id爲central,遠程url地址爲http://repo.maven.apache.org/maven2,它關閉了snapshot版本構件下載的支持。

1.3 遠程倉庫(私服)

在POM中配置遠程倉庫
前面我們看到超級POM配置了ID爲central的遠程倉庫,我們可以在POM中配置其它的遠程倉庫。這樣做的原因有很多,比如你有一個局域網的遠程倉庫,使用該倉庫能大大提高下載速度,繼而提高構建速度,也有可能你依賴的一個jar在central中找不到,它只存在於某個特定的公共倉庫,這樣你也不得不添加那個遠程倉庫的配置。

1.3.1 pom.xml中配置遠程倉庫
這裏配置一個遠程倉庫指向中央倉庫的中國鏡像,需要在你的maven項目pom.xml文件中增加:

<span style="color:#000000"><code><project>  
...  
  <repositories>  
    <repository>  
      <id>maven-net-cn</id>  
      <name>Maven China Mirror</name>  
      <url>http://maven.net.cn/content/groups/public/</url>  
      <releases>  
        <enabled>true</enabled>  
      </releases>  
      <snapshots>  
        <enabled>false</enabled>  
      </snapshots>  
    </repository>  
  </repositories>  
  <pluginRepositories>  
    <pluginRepository>  
      <id>maven-net-cn</id>  
      <name>Maven China Mirror</name>  
      <url>http://maven.net.cn/content/groups/public/</url>  
      <releases>  
        <enabled>true</enabled>  
      </releases>  
      <snapshots>  
        <enabled>false</enabled>  
      </snapshots>      
    </pluginRepository>  
  </pluginRepositories>  
...  
</project>  
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

1. <repositories>講解:
我們先看一下<repositories>的配置,你可以在它下面添加多個<repository> ,每個<repository>都有它唯一的ID,一個描述性的name,以及最重要的,遠程倉庫的url。此外,<releases><enabled>true</enabled></releases>告訴Maven可以從這個倉庫下載releases版本的構件,而<snapshots><enabled>false</enabled></snapshots>告訴Maven不要從這個倉庫下載snapshot版本的構件。禁止從公共倉庫下載snapshot構件是推薦的做法,因爲這些構件不穩定,且不受你控制,你應該避免使用。當然,如果你想使用局域網內組織內部的倉庫,你可以激活snapshot的支持。

2. <pluginRepositories>講解:
至於,這是配置Maven從什麼地方下載插件構件(Maven的所有實際行爲都由其插件完成)。該元素的內部配置和完全一樣,不再解釋。

1.3.2 settings.xml中配置遠程倉庫
我們知道了如何在POM中配置遠程倉庫,但考慮這樣的情況:在一個公司內部,同時進行這3個項目,而且以後隨着這幾個項目的結束,越來越多的項目會開始;同時,公司內部建立一個Maven倉庫。我們統一爲所有這些項目配置該倉庫,於是不得不爲每個項目提供同樣的配置。問題出現了,這是重複 !
其實我們可以做到只配置一次,在哪裏配置呢?就是settings.xml。
不過事情沒有那麼簡單,不是簡單的將POM中的及元素複製到settings.xml中就可以,setting.xml不直接支持 這兩個元素。但我們還是有一個並不複雜的解決方案,就是利用profile,如下:

<span style="color:#000000"><code><settings>  
  ...  
  <profiles>  
    <profile>  
      <id>dev</id>  
      <!-- repositories and pluginRepositories here-->  
    </profile>  
  </profiles>  
  <activeProfiles>  
    <activeProfile>dev</activeProfile>  
  </activeProfiles>  
  ...  
</settings>  
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

這裏我們定義一個id爲dev的profile,將所有repositories以及pluginRepositories元素放到這個profile中,然後,使用元素自動激活該profile。這樣,你就不用再爲每個POM重複配置倉庫。
使用profile爲settings.xml添加倉庫提供了一種用戶全局範圍的倉庫配置。

1.4 使用鏡像

需求:

  1. 如果你的地理位置附近有一個速度更快的central鏡像;
  2. 你想覆蓋central倉庫配置;
  3. 你想爲所有POM使用唯一的一個遠程倉庫(這個遠程倉庫代理的所有必要的其它倉庫)。

注: 如果配置了鏡像,maven將不再去找中央工廠統一去找鏡像地址下載
你可以使用settings.xml中的mirror配置。
以下的mirror配置用maven.net.cn覆蓋了Maven自帶的central:

<span style="color:#000000"><code>
<settings>  
...  
  <mirrors>  
    <mirror>  
      <id>maven-net-cn</id>  
      <name>Maven China Mirror</name>  
      <url>http://maven.net.cn/content/groups/public/</url>  
      <mirrorOf>central</mirrorOf>  
    </mirror>  
  </mirrors>  
...  
</settings> 
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  1. 在mirrorOf與repositoryId相同的時候優先是使用mirror的地址
  2. mirrorOf等於的時候覆蓋所有repository配置mirrorOf等於的時候覆蓋所有repository配置
  3. 存在多個mirror配置的時候mirrorOf等於放到最後存在多個mirror配置的時候mirrorOf等於放到最後
  4. 只配置mirrorOf爲central的時候可以不用配置repository只配置mirrorOf爲central的時候可以不用配置repository
<span style="color:#000000"><code><?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">
  <localRepository>X:\工具\maven資源\repository</localRepository>
  <pluginGroups></pluginGroups>
  <proxies></proxies>
  <servers></servers>
  <mirrors>
    <mirror>
      <id>nexus-aliyun</id>
      <name>Nexus aliyun</name>
      <mirrorOf>central</mirrorOf>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    <mirror>
      <id>nexus-mine</id>
      <name>Nexus mine</name>
      <mirrorOf>*</mirrorOf>
      <url>http://xx.xx.xx.xx/nexus/content/groups/public</url>
    </mirror>
  </mirrors>
  <profiles></profiles>
</settings>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

nexus-aliyun使用阿里雲的鏡像作爲central中央倉庫

nexus-mine作爲私服,mirrorOf配置爲*來提供中央倉庫中不存在的jar包

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