天天看點

[Maven]倉庫

01. Maven倉庫分類

a). 本地倉庫(本地資源庫)

b). 中央倉庫(中央存儲庫)

c). 遠端倉庫(遠端存儲庫)

02. Maven依賴查詢

Maven的依賴庫查詢順序為:

       1. 在 Maven 本地資源庫搜尋,如果沒有找到,進入第 2 步,否則退出。

       2. 在 Maven 中央存儲庫搜尋,如果沒有找到,進入第 3 步,否則退出。

3. 在 Maven 遠端存儲庫搜尋,如果沒有找到,提示錯誤資訊,否則退出。

03. 簡介及配置

是什麼? 幹什麼用?如何配置?

03-A. 本地倉庫

a). 簡介

Maven的本地資源庫是Maven在本地存儲構件的倉庫,用于将Maven項目的依賴關系(jar)和其他檔案存儲在本地檔案夾。

注意:maven的本地倉庫,在安裝maven後并不會建立,它是在第一次執行maven指令的時候才被建立。

b). 配置

maven本地倉庫的預設位置:在使用者的目錄下都有一個 .m2/repository/ 的倉庫目錄,即 {USER_HOME}/.m2/repository/

1). 更改配置使用者範圍的本地倉庫:修改 {USER_HOME}/.m2/settings.xml 檔案,設定 localRepository 元素的值為想要的倉庫位址

<!-- localRepository
 | The path to the local repository maven will use to store artifacts.
 |
 | Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>E:\develop\repositories\maven\repository</localRepository>
           

這時候,maven的本地倉庫位址就變成了 E:\develop\repositories\maven\repository

注意:此時配置的maven的本地倉庫是屬于使用者範圍的。

2). 更改配置全局範圍的本地倉庫:在 {MAVEN_HOME}/conf/settings.xml 中更改配置,更改配置的方法同上

注意:此時更改後,所有的使用者都會受到影響,而且如果maven進行更新,那麼所有的配置都會被清除,是以要提前複制和備份 {MAVEN_HOME}/conf/settings.xml 檔案

03-B. 中央倉庫

a). 簡介

Maven 中央倉庫是由 Maven 社群提供的倉庫,其中包含了大量常用的庫。

中央倉庫包含了絕大多數流行的開源Java構件,以及源碼、作者資訊、SCM、資訊、許可證資訊等。在本地倉庫沒有依賴的構件時,Maven将從中央倉庫中下載下傳。

注意:中央倉庫并不是囊括了所有的構件。

b). 配置

i. 在安裝Maven的時候,預設配置了中央倉庫為 Maven中央倉庫 。該配置存在于所有Maven項目都會繼承的 超級pom.xml 中,具體配置如下:

<repositories>
  <repository>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>Central Repository</name>
    <url>https://repo.maven.apache.org/maven2</url>
  </repository>
</repositories>
           

該配置與遠端倉庫的配置類似,元素的詳細說明見 遠端倉庫-配置;超級pom的介紹詳見附錄;Maven中央倉庫的url詳見附錄。

ii. 國内Maven中央倉庫鏡像下載下傳有時會出現下載下傳不流暢的情況,是以選用阿裡雲的Maven中央倉庫鏡像,配置 settings.xml 如下:

<!-- mirrors
 | This is a list of mirrors to be used in downloading artifacts from remote repositories.
 |
 | It works like this: a POM may declare a repository to use in resolving certain artifacts.
 | However, this repository may have problems with heavy traffic at times, so people have mirrored
 | it to several places.
 |
 | That repository definition will have a unique id, so we can create a mirror reference for that
 | repository, to be used as an alternate download site. The mirror site will be the preferred
 | server for that repository.
 |-->
<mirrors>
  <mirror>
    <id>nexus-aliyun</id>
    <name>nexus-aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>
           

03-C 遠端倉庫

a). 簡介

遠端倉庫是開發人員自己定制的倉庫,包含了所需要的代碼庫或者其他工程中用到的 jar 檔案。

如果所需的構件不存在于本地倉庫和中央倉庫,那麼Maven的建構過程将被停止并将錯誤消息輸出到Maven控制台。為避免這種情況,将在遠端倉庫中提供這些私有構件。

遠端倉庫分為:01.私服,02.公共倉庫

b). 配置

在 pom.xml 中添加JBoss遠端倉庫如下:

<project>
  <repositories>
	<repository>
	  <id>jboss</id>
	  <name>JBoss Repository</name>
	  <url>http://repository.jboss.org/nexus/content/groups/public/</url>
	  <releases>
	    <updatePolicy>daily</updatePolicy><!-- never,always,interval n,daily -->
	    <enabled>true</enabled>
	    <checksumPolicy>warn</checksumPolicy><!-- fail,ignore,warn -->
	  </releases>
	  <snapshots>
	    <enabled>false</enabled>
	  </snapshots>
	  <layout>default</layout>
	</repository>
  </repositories>
</project>
           

出于安全方面的考慮,有時我們要對遠端倉庫的通路進行認證,一般将認證資訊配置在settings.xml中:

<settings>
  <servers>
    <server>
      <!-- 這是server的id(注意不是使用者登陸的id),該id與repository元素中的id相比對 -->
      <id>same with repository id in pom</id>
      <username>username</username>
      <password>pwd</password>
    </server>
  </servers>
</settings>
           

更多配置及其含義詳見, 附錄

附 02. Maven依賴

maven到底是如何從倉庫中解析構件的呢?

a-1. 當依賴的範圍是system時, Maven直接從本地倉庫解析構件

b-1. 根據依賴坐标計算倉庫路徑後, 嘗試直接從本地倉庫尋找構件, 如果發現相應構件, 則解析成功; 在本地倉庫不存在相應構件的情況下:

b-2. 如果依賴的構件版本是釋出版本, 則周遊所有的遠端倉庫, 發現後下載下傳使用

b-3. 如果依賴的構件版本是RELEASE或LATEST, 則基于更新政策讀取所有遠端倉庫的中繼資料, 将其與本地倉庫的對應中繼資料合并後,

       計算出RELEASE或者LATEST的真實值, 然後基于這個真實值檢查本地倉庫

b-4. 如果依賴的構件版本是SNAPSHOT, 則基于更新政策讀取所有遠端倉庫的中繼資料, 将其與本地倉庫的對應中繼資料合并後,

       得到最新快照版本的值, 然後基于該值檢查本地倉庫或從遠端倉庫下載下傳

b-5. 如果依賴的構件版本是時間戳格式的快照, 則複制其時間戳格式的檔案 至 非時間戳格式, 并使用該非時間戳格式的構件

注: 一定要記得<release><enabled> & <snapshot><enabled>, 對于快照也是一樣.  在POM的依賴聲明的時候不推薦使用LATEST & RELEASE,

在Maven3中也不再支援在插件配置中使用LATEST & RELEASE, 如果不設定插件版本, 那麼最終版本和release一樣, maven隻會解析最新的釋出版本建構。

附 03-B. 中央倉庫

A. Maven的中央資源庫:Maven center repository

http://repo1.maven.org/maven2/

http://repo2.maven.org/maven2/

https://repo.maven.apache.org/maven2

[Maven]倉庫

B. Maven中央儲存庫:maven center repository search

Maven中央儲存庫的目錄浏覽功能現已不能使用,不過其提供了搜尋功能。

https://mvnrepository.com/

[Maven]倉庫

C. Maven的超級pom

所有的maven項目都會繼承超級pom,包含繼承預設值。它可以幫助開發人員指定最低配置的詳細資訊寫在 pom.xml 中, 但是配置可以很容易被覆寫。

一個簡單的方法來看看超級POM的預設配置,通過運作下面的指令:mvn help:effective-pom 。已經建立了一個 超級pom.xml 在D:\develop\maven\spurpom\ 檔案夾中。

D:\develop\maven\spurpom> mvn help:effective-pom

附 03-C. 遠端倉庫

在settings.xml中配置遠端倉庫, 如下:

<settings>
  <profiles>
    <profile>
      <repositories>                  
        <!-- 需要連接配接到目标遠端倉庫的資訊 -->
        <repository>                      
          <!-- 遠端倉庫唯一辨別 -->
          <id>codehausSnapshots</id>                      
          <!-- 遠端倉庫名稱 -->
          <name>Codehaus Snapshots</name>                      
          <!-- 如何處理遠端倉庫裡釋出版本的下載下傳 -->
          <releases>                          
            <!-- true或者false表示:該倉庫是否開啟下載下傳某種構件的釋出版(快照版)  -->
            <enabled>false</enabled>                          
            <!-- 更新發生的頻率(Maven會比較本地POM和遠端POM的時間戳), 選項如下:-->
            <!-- always(一直), daily(每日,預設), interval:X(這裡X是以分鐘為機關的時間間隔), never(從不) -->
            <updatePolicy>always</updatePolicy>                          
            <!-- 當Maven驗證構件校驗檔案失敗時該怎麼做: -->
            <!-- ignore(忽略), fail(失敗), warn(警告,預設) -->
            <checksumPolicy>warn</checksumPolicy>                             
          </releases>                      
          <!-- 如何處理遠端倉庫裡快照版本的下載下傳. 有了 releases 和 snapshots 這兩組配置, POM就可以在每個單獨的倉庫中, 為每種類型的構件采取不同的政策。-->
          <!-- 例如, 可能有人會決定隻為開發目的開啟對快照版本下載下傳的支援. 參見repositories/repository/releases元素 -->
          <snapshots>                              
            <enabled />
            <updatePolicy />
            <checksumPolicy />                             
          </snapshots>                      
          <!-- 遠端倉庫URL,按protocol://hostname/path形式  -->
          <url>http://snapshots.maven.codehaus.org/maven2</url>                      
          <!-- 用于定位和排序構件的倉庫布局類型: default(預設), legacy(遺留) -->
          <!-- Maven 2為其倉庫提供了一個預設的布局;然而,Maven 1.x有一種不同的布局。我們可以使用該元素指定布局是default(預設)還是legacy(遺留)。  -->
          <layout>default</layout>                        
        </repository>                   
      </repositories>
    </profile>
  </profiles>
</settings>
           

settings.xml配置詳解: (包含 本地倉庫, 中央倉庫, 遠端倉庫, 代理, profile )