1. 程式人生 > >maven系列-(三)maven倉庫

maven系列-(三)maven倉庫

我們在使用maven的時候,一定接觸到過倉庫的概念,我們的jar包全都放在倉庫裡,使用的時候,直接就可以從倉庫裡找到了。

什麼是maven倉庫:

maven組織存放構件的地方,分為遠端倉庫和本地倉庫。

使用maven倉庫的好處:

在使用maven以前,都是手動的在專案引入jar包,一般會在專案目錄下新建一個lib資料夾,把jar包複製進去,然後還需要add jar,把jar包新增到Libraries中,才算是能夠使用。這樣就會存在一些問題,我們每個專案都會用到一些相同的包,如果在每個目錄中都複製匯入一份,那就會造成空間的浪費,還不利於統一管理。
既然maven引入了座標的概念,可以保證專案組的人在使用的時候,下載下來的都是相同的jar包,那就還可以再進一步,把這些jar包統一放在一個路徑下去管理。每個專案不需要再把jar包放在自己的專案目錄下了,只需要宣告這些依賴的座標,maven就自動的去這個路勁下找到對應的依賴,這樣就變得更加的合理。這就是maven倉庫。

maven倉庫的分類:

maven倉庫分為本地倉庫和遠端倉庫。maven根據座標查詢依賴的時候,先去本地倉庫找,找不到的話,再去遠端倉庫找。

本地倉庫的路徑,預設是使用者目錄下的.m2/repository/,進去這個目錄下的話,可以看到有很多的資料夾,對應下載的各種依賴包。就比如我們上一篇文章中引入的spring-core的jar包,就可以在這裡找到:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.1.0.RELEASE</version>
</dependency>

找到的jar包路徑是:/org/springframework/spring-core/5.1.0.RELEASE,進去之後就可以看到裡面的內容。
在這裡插入圖片描述
這裡就包含引入的jar包了。
這裡就涉及到本地倉庫的路徑規則,一般情況下,引入的jar包在repository下的存放路徑為:groupId/artifactId/version/artifactId-version.packaging,並且會把groupId中的"."也換成路徑的分隔符。
我們引入spring-core的groupId為org.springframework,artifactId為spring-core,version為5.1.0.RELEASE,packaging是jar,所以對應的檔案為/org/springframework/spring-core/5.1.0.RELEASE/spring-core-5.1.0.RELEASE.jar

說完了本地倉庫,再說下遠端倉庫,遠端倉庫分為三種:中央倉庫、其他公共庫和私服。
中央倉庫是maven自帶的倉庫,預設的配置下,當本地倉庫沒有找到對應的依賴時,就會去中央倉庫下載。
其他公共庫,就是一些其他公開的非中央倉庫,比如java.net maven庫、Jboss maven庫等。
私服:是在區域網內搭建的一個私有的倉庫伺服器,一般在組織內,代理所有的外部遠端倉庫,存放一些不對外公開的內部構件。
在這裡插入圖片描述

一般情況下,一個組織內進行開發時,都推薦搭建自己的私服。因為如果沒有私服的話,每次下載依賴,都需要請求外部的倉庫,比較耗費流量,而且有些外部倉庫的伺服器在國外,訪問速度也很慢。採用了私服,當私服上不存在相應的構件時,就會去請求外部的倉庫下載,下載完成之後快取在私服上,這樣其他人下載的時候,直接從私服上下載就可以了,速度會很快,也減少了中央倉庫的壓力。除此之外,私服還可以存放組織內部的一些構件,供內部人員下載使用。

遠端倉庫的配置:

可以通過repositories標籤來配置遠端倉庫:

<repositories>
    <repository>
        <id>test-nexus</id>
        <url>http://maven.test.com:8081/nexus/content/xxx/xxx</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

repositories標籤中可以配置多個repository,一個repository代表一個遠端倉庫。
裡面的id代表倉庫的id,這個id必須是唯一的。maven自帶的中央倉庫,id為central,如果我們自己配置了同樣id的倉庫,就會覆蓋掉maven自帶的中央倉庫。
url代表倉庫的地址,releases標籤為true,代表支援下載構件的釋出版本,snapshots標籤為true,表示支援下載構件的快照版本。
如果遠端倉庫需要認證的話,則需要在.m2/settings.xml中新增使用者名稱和密碼,不能配置在pom檔案中,因為在本地配置使用者名稱和密碼比較安全。

repositories標籤是配置下載構件的遠端倉庫的,還有一個distributionManagement,則是配置上傳構件的遠端倉庫的。
maven可以把專案生成的構件,上傳到倉庫中,供其他團隊成員下載使用,需要在pom檔案中增加:

<distributionManagement>
    <repository>
        <id>test_Local</id>
        <url>http://maven.test.com:8081/nexus/content/xxx/test_Local</url>
    </repository>
    <snapshotRepository>
        <id>test_Local_Snapshots</id>
     	<url>http://maven.test.com:8081/nexus/content/xxx/test_Local_Snapshots</url>
    </snapshotRepository>
</distributionManagement>

distributionManagement中定義了repository和snapshotRepository兩個標籤,repository代表釋出版本構件的倉庫,snapshotRepository代表快照版本的倉庫。
如果上傳構件的倉庫也需要認證的話,同樣在.m2/settings.xml中新增使用者名稱和密碼。
我們在這些配置中,經常能夠看到快照版本,那什麼是快照版本,什麼又是釋出版本呢。

釋出版本和快照版本:

我們在pom檔案中引入依賴時,有時候會看到引入的依賴後面帶了一個SNAPSHOT,這就說明引入的這個版本是個快照版本。快照版本屬於不穩定的版本,可能會經常更新。當快照版本進行了更新時,maven就會拉取最新的版本。
和快照版本相對應的就是釋出版本,釋出版本說明這個版本已經穩定了。
我們在配置遠端倉庫的時候,有個snapshots標籤,enabled值定義了true,但其實這個並沒有寫全,完整的是這樣子的:

<snapshots>
    <enabled>true</enabled>
    <updatePolicy>daily</updatePolicy>
    <checksumPolicy>ignore</checksumPolicy>
</snapshots>

這裡的updatePolicy就是maven從遠端倉庫檢查更新的頻率,預設就是daily,一天檢查一次,checksumPolicy代表maven檢查檢驗和檔案的策略。如果我們定義的snapshots的enabled為true,那即使不定義updatePolicy,也預設是一天檢查一次,如果版本有更新,maven就會下載最新的依賴構件。
平時一般不推薦使用快照版本,因為這可能會導致系統的不穩定,比如今天除錯的正常的功能,第二天突然報錯了。快照版本只適合在開發聯調的過程中,防止一次次的引入依賴,當開發除錯完成,就需要把快照版本改為釋出版本了。

那我們只是引入了了xxx1.0-SNAPSHOT版本的依賴,maven是怎麼知道這個快照版本有更新的呢。其實,當釋出一個快照版本的構件時,maven就會自動的為這個版本打上一個時間戳,所以,當每天檢查的時候,就可以根據這個時間戳判斷是否需要更新了。

參考資料:
1.《maven實戰》 許曉斌 著