(三)Maven之倉庫

目錄apache

引言:座標和依賴是一個構件在Maven世界中邏輯表示方式,而構件的物理表示方式就是文件而已,倉庫就是統一管理這些文件的地方。maven

image.png

目錄佈局

倉庫類別

  • 本地倉庫
  • 遠程倉庫: 中倉倉庫(自帶的默認遠程倉庫)、私服(一種特殊的遠程倉庫)、其餘

倉庫路徑與座標的關係

簡而言之,具體的路徑根據座標計算得到;ui

經過座標大體對應的倉庫路徑以下:
groupId/artifactId/version/artifact-version.packaging
注:閱讀Maven源碼得出。。

本地倉庫

位置: 在本地機器當前用戶目錄下 .m2/repository文件夾中。
注:當用戶輸入第一條命令後,Maven纔會建立本地倉庫。每一個用戶只有一個本地倉庫。阿里雲

私服

存在的意義

1.節省外網帶寬和減小Maven構建的時間
2.部署第三方構件
3.提升穩定性、加強控制url

做用

代理全部的外部的遠程倉庫插件

中央倉庫

安裝的Maven自帶了中央倉庫配置,Maven3中配置位於$M2_HOME/lib/maven-model-builder-3.0.jar裏的/org/apache/maven/model/pom-4.0.0.xml的文件中,全部的Maven項目都會繼承這個超級POM,配置以下:命令行

<repositories>
    <repository>
        <id>central </id>   <!-- 惟一標識 -->
        <name> Maven Repository Switchboard </name> <!-- 倉庫名稱 -->
        <url>http://repo1.maven.org/maven2<url><!-- 倉庫地址 -->
        <layout>default</layout> <!-- 設置佈局 -->
        <snapshots>
            <enabled> false </enabled>  <!-- 可否從倉庫下載快照版本的構件 -->
        </snapshorts>
    </repository>
</repositories>

倉庫配置

倉庫配置、倉庫認證配置、倉庫鏡像配置代理

關鍵點: 倉庫的ID的指定, 它是多個配置能關聯起來的的紐帶。code

倉庫配置: 在項目的pom.xml中配置
倉庫認證配置: 在本地Maven的setting.xml中配置
倉庫鏡像配置:在本地Maven的setting.xml中配置

倉庫配置

舉個栗子🌰:

<project>
...
<repositories>
    <repository>
        <id>jboss </id>   <!-- 惟一標識 -->
        <name> JBoss Repository </name> <!-- 倉庫名稱 -->
        <url>http://repository.jobss.com/maven2<url><!-- 倉庫地址 -->
        <layout>default</layout> <!-- 設置佈局 -->
         <releases>
            <enabled> true </enabled>  <!-- 可否從倉庫下載發佈版本的構件 -->
        </releases>
        <snapshots>
            <enabled> false </enabled>  <!-- 可否從倉庫下載快照版本的構件 -->
            <updatePolicy> daily </updatePolicy><!- 設置從遠處倉庫檢查更新頻率,默認值:daily; 可選值:daily,never,always,interval:X -->
            <checksumPolicy> ignore </checksumPolicy><!-- 設置Maven驗證 *校驗和文件*的策略,默認值:warn; 可選值:warn,fail,ignore (下載構件時,Maven會驗證構件的*校驗和文件*,若驗證失敗改如何處理呢?即便用該配置處理) -->
        </snapshorts>
    </repository>
</repositories>
...
</project>

要特別注意:若是倉庫的ID命名重複了,新的會覆蓋老的倉庫配置。

擴展: 可使用命令行-U參數強制讓Maven檢查更新,如mvn clean install -U ;Maven就會暫時忽略倉庫updatePolicy元素的配置。

##### 倉庫認證配置
舉個栗子🌰:

<servers>
 <server>
   <id>jboss</id>
   <username>root</username>
   <password>123456</password>
 </server>
</servers>
鏡像配置

舉個栗子🌰:

<!-- 阿里雲鏡像 -->
   <mirror>
       <id>nexus-aliyun</id>
       <name>Nexus aliyun</name>
       <url>http://maven.aliyun.com/nexus/content/groups/public</url>
       <mirrorOf>*</mirrorOf>   <!-- 鏡像倉庫所代理倉庫的範圍,支持指定被鏡像的倉庫名和排除某些倉庫 -->
   </mirror>

啥是鏡像倉庫? 若是倉庫X能夠提供倉庫Y所存儲的全部內容,就能夠認爲倉庫X是Y的一個鏡像。

注意: 因爲鏡像倉庫X徹底屏蔽了被鏡像的倉庫Y,所以即便鏡像倉庫X掛了,你就廢了,懂不,這裏被鏡像的倉庫沒吊毛關係的。

部署至遠程倉庫: mvn clean deploy
```
在須要上傳的工程中的pom.xml文件中加入下面的配置



release
Release Repository
http://ip/nexus/content/repositories/releases


snapshot
Snapshot Repository
http://ip/nexus/content/repositories/snapshots


或者
使用命令行方式
mvn deploy:deploy-file -DgroupId=groupId -DartifactId=artifactId -Dversion=version -Dfile=本地jar包路徑 -DrepositoryId=releases/snapshots -Durl=倉庫地址

舉例:上傳jmxri-1.2.1.jar,本地存放在D盤
mvn deploy:deploy-file -DgroupId=com.sun.jmx –DartifactId=jmxri -Dversion=1.2.1 -Dfile=d:/jmxri-1.2.1.jar -DrepositoryId=releases -Durl=http://ip/nexus/content/repositories/releases
```

規則: 快照版本部署到快照倉庫中,其餘部署到發佈版本倉庫中。

解密倉庫解析依賴機制

基礎概念
  • LATEST版本:最新版本
  • RELEASE版本:最新發布版本

    最新的版本號基於元數據:groupId/artifactId/maven-metadata.xml計算出來的。

  • SNAPSHOT版本:最新的快照版本

    最新的版本號基於元數據:groupId/artifactId/version/maven-metadata.xml計算出來的。
    在解析前,要先經過元數據計算出最新版本號。

解析機制
  1. 當依賴範圍是system時,Maven會直接從本地文件系統解析構件。
  2. 構件會先從本地尋找,本地不存在再從遠程倉庫下載。
  3. 若是最後解析獲得的構件版本是時間戳格式的快照,則要先轉化爲非時間戳格式,如:SNAPSHOT格式,,而後使用非時間戳格式構件。
  4. 當構件的版本不明晰時,如RELEASE、LATEST,SNAPSHOT. Maven採用最新策略,

    1. 先基於更新遠程倉庫的策略來檢查更新,決定更新後,須要檢查倉庫的元數據。
    2. 讀取全部遠程倉庫的元數據
    3. 而後同本地元數據合併,計算並得到最新的RELEASE、LATEST,SNAPSHOT的值
    4. 基於該值先從本地獲取或者從遠程倉庫下載

中肯建議

  • 不推薦在依賴聲明中使用LATEST和RELEASE版本,特別是LATEST版本,存在必定的隱患。
    注:Maven3已不在支持在插件配置中使用LATEST和RELEASE,但若是不設置插件版本,其效果同RELEASE同樣,Maven只會解析最近的發佈版本構件。

  • 項目不該該依賴於任何組織外部的快照版本依賴。

相關文章
相關標籤/搜索